8

मैं एक कस्टम कंटेनर दृश्य नियंत्रक (MainViewController) है कहो जहाँ मैं कुछ इस तरह करते हैं: जैसे कि "जाओ"कंटेनर देखें नियंत्रक - सूचित कार्रवाई की मूल

- (void)viewDidLoad 
{ 
    [super viewDidLoad];   

    HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil]; 
    [self addChildViewController:homeVC]; 
    [self.view addSubview:homeVC.view]; 

} 

HomeViewController एक बटन है, यह है कि दबाए जाने पर अगले दृश्य नियंत्रक को अग्रिम करने की आवश्यकता होगी। इसलिए मुझे इस क्रिया के मेनव्यू कंट्रोलर को सूचित करने की आवश्यकता है। इसे करने का बेहतरीन तरीका क्या है?

मैं एक कस्टम कंटेनर का उपयोग कर रहा हूं क्योंकि मुझे दृश्य नियंत्रकों के बीच कस्टम संक्रमण करने की आवश्यकता है। जब "जाने" दबाया जाता है, तो होम व्यू कंट्रोलर पर कुछ विचार एनिमेट हो जाएंगे, जबकि नए व्यू कंट्रोलर के विचार जगह में एनिमेट हो रहे हैं।

स्पष्ट रूप से मैं होमव्यू कंट्रोलर को मेनव्यू कंट्रोलर की एक संपत्ति दे सकता हूं और कॉल कर सकता हूं, लेकिन मुझे उम्मीद है कि कंटेनर व्यू कंट्रोलर एपीआई के साथ एक क्लीनर तरीका है।

उत्तर

15

आप या तो प्रतिनिधि या ब्लॉक का उपयोग कर सकते हैं;

प्रतिनिधि

का उपयोग करते हुए एक प्रोटोकॉल बनाएँ:

@protocol SomeProtocol <NSObject> 
- (void)someAction; 
@end 

बस इस तरह HomeViewController.h में एक प्रतिनिधि की घोषणा:

id<SomeProtocol> delegate; 

और फिर MainViewController के viewDidLoad में इस तरह यह सेट :

homeVC.delegate = self; 
//some where in MainViewController implement the protocol method 
-(void)someAction 
{ 
    //do something 
} 

फिर जब आप homeVC में बटन दबाते हैं, बस फोन:

if ([self.delegate respondsToSelector:@selector(someAction)]) { 
    [self.delegate someAction]; 
} 

ब्लॉक का उपयोग करना:

HomeViewController.h में एक ब्लॉक संपत्ति की घोषणा:

typedef void (^ActionBlock)(); 

@property (nonatomic, copy) ActionBlock block; 

तो MainViewController ViewDidLoad में:

homeVC.block = ^(){ 
    //do something 
}; 

फिर जब आप homeVC में बटन दबाते हैं, बस फोन:

self.block(); 
+0

ठीक है, तो वहाँ कुछ भी नहीं मैं UIViewController रोकथाम एपीआई से लाभ उठा सकते हैं क्या है? – soleil

+0

काफी सुनिश्चित नहीं हैं कि बू इस पोस्ट मदद कर सकता है [इस जाँच] (http://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5) –

+1

मैं +1 चाहते अगर मैं कर सकता था तो यह 3 बार खत्म हो गया। इतना ही नहीं यह मेरे लिए एक ही सवाल का जवाब था, लेकिन यह ब्लॉक की मेरी समझ दस गुना उन्नत :) – Pedro

10

एक और तरीका भी नहीं है ... हर दृश्य नियंत्रक एक parentViewController संपत्ति इतनी का उपयोग कर आप इस ...

कर सकते हैं कि है

MainViewController में आपने जो कार्रवाई करना चाहते हैं के लिए एक विधि को परिभाषित ...

- (void)someMethod:(BOOL)someParam; 
फिर HomeViewController में

आप कर सकते हैं ...

MainViewController* parent = (MainViewController*)[self parentViewController]; 
[parent someMethod:paramValue]; 

HTH :)

+2

यहां अच्छा त्वरित और गंदा तरीका है। यदि आपके पास प्रोटोकॉल तैयार करने के लिए थोड़ा और समय है तो चयनित उत्तर का उपयोग करें। धन्यवाद पेड्रो! –

3

यह एक बहुत ही आम पैटर्न है।माता पिता वास्तविक उदाहरण है कि कार्रवाई संभाल लेंगे, एक और एक default extension प्रदान करके किया जाएगा।

स्विफ्ट 3 में:

जनक दृश्य नियंत्रक:

protocol SomeProtocol { 
    func foo() 
} 

extension ParentViewController: SomeProtocol { 
    func foo() { 
     // Parent handles it 
    } 
} 

बाल दृश्य नियंत्रक:

@IBAction func tapGo(_ sender: Any) { 
    (parent as? SomeProtocol)?.foo() 
} 
+0

बहुत बहुत धन्यवाद यह वही था जो मैं ढूंढ रहा था :) – mic