2015-05-16 11 views
6

मैं एक जनक UIViewController है, जो एक बच्चे UIViewController खोलता है एक बच्चे से एक माता पिता UIViewController विधि बुला:UIViewController

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! UIViewController 
self.presentViewController(vc, animated: true, completion: nil) 

मैं ChildView में एक बटन जो ChildView को बंद करने और में एक विधि फोन करना चाहिए दबाएँ अभिभावक देखें:

self.dismissViewControllerAnimated(true, completion: nil) 
CALL PARENTS METHOD ?????? 

यह कैसे करें? मुझे एक अच्छा जवाब मिला (Link to good answer), लेकिन मुझे यकीन नहीं है कि यह UIViewControllers के साथ सबसे अच्छा अभ्यास है या नहीं। क्या कोई मदद कर सकता है?

+0

आपके लिंक में प्रतिनिधिमंडल पैटर्न ऐसा करने का सही तरीका है, और जब आप व्यू कंट्रोलर का उपयोग करते हैं तो यह ठीक काम करता है। एकमात्र समय यह काम नहीं करता है जब आप सेग्स का उपयोग कर रहे हैं, लेकिन फिर भी यह काम करने के लिए कोड की एक अतिरिक्त दो या तीन पंक्तियां है। अनुभाग शीर्षक "तैयार करना चाहते हैं" यहां देखें: http://makeapppie.com/2014/07/01/swift-swift-using-segues-and-delegates-in-navigation-controllers-part-1-the-template/ – chedabob

+0

क्या आप मेरा उत्तर देख सकते हैं –

+0

सरल तरीका यहां मिलता है: http://stackoverflow.com/a/28476319/1953178 –

उत्तर

12

एक आसान तरीका आप इस लक्ष्य को हासिल करने के लिए इसके लिए NSNotificationCenter का उपयोग कर सकते हैं।

में अपने ParentViewControllerviewDidLoad विधि में इस जोड़ें: ParentViewController में इस समारोह को जोड़ने के जो कहा जाता हो जाएगा जब आप अपने ChildViewController खारिज

override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshList:", name:"refresh", object: nil) 
} 

उसके बाद:

func refreshList(notification: NSNotification){ 

    println("parent method is called") 
} 

और अपने में ChildViewController इस ऐड कोड जहां आप अपने बच्चे के दृश्य को खारिज करते हैं:

@IBAction func btnPressed(sender: AnyObject) { 

    NSNotificationCenter.defaultCenter().postNotificationName("refresh", object: nil) 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

अब जब आप बच्चे के दृश्य को खारिज करते हैं refreshList विधि कॉल की जाएगी।

1

कुछ ऐसा जो मैंने आपके प्रश्न में देखा है: व्यू कंट्रोलर को खारिज करने के बाद एक विधि (अपने मामले में मूल विधि) को कॉल न करें। दृश्य नियंत्रक को खारिज करने से इसे हटा दिया जाएगा। बाद में आदेश निष्पादित नहीं किए जा सकते हैं।

जो लिंक आपने अपने प्रश्न में शामिल किया है वह एक अच्छे जवाब के लिए इंगित करता है। आपके मामले में, मैं प्रतिनिधिमंडल का उपयोग करूंगा। बच्चे दृश्य नियंत्रक को खारिज करने से पहले प्रतिनिधि दृश्य नियंत्रक में प्रतिनिधि विधि को कॉल करें।

यहां एक उत्कृष्ट tutorial है।

+0

सहायता के लिए धन्यवाद। मैंने अच्छे लिंक में समाधान को लागू करने की कोशिश की, लेकिन मुझे एक समस्या का सामना करना पड़ रहा है। UIViewController के साथ मैं प्रतिनिधि (child.delegate = self) सेट नहीं कर सकता। मेरा मतलब है कि मैं नहीं कर सकता: vc.delegate = self। –

+0

हैलो, यह काम करना चाहिए। आपको क्या त्रुटि संदेश मिलता है? – vomako

+0

'UIViewController' के पास 'प्रतिनिधि' नामक सदस्य नहीं है –

2

बच्चे दृश्य नियंत्रक कि जनक दृश्य नियंत्रक

class ChildViewController: UIViewController { 
weak var parentViewController: UIViewController? 
.... 
} 
फिर अपने कोड में

के लिए एक संदर्भ को शामिल करना चाहिए करने के लिए एक कमजोर संपत्ति जोड़ें (मैं इसे अपने माता पिता को देखने के नियंत्रक अंदर संभालने हूँ),

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("myChildView") as! ChildViewController 
vc.parentViewController = self 
self.presentViewController(vc, animated: true, completion: nil) 

और, जैसा कि वोमाको ने कहा, अपने बच्चे के दृश्य नियंत्रक को खारिज करने से पहले माता-पिता की विधि को कॉल करें।

parentViewController.someMethod() 
self.dismissViewControllerAnimated(true, completion: nil) 

या, आप भी dismissViewControllerAnimated, जहां यह के बाद चलाया जाएगा के पूरा होने के पैरामीटर में विधि कॉल कर सकते हैं आप बच्चे को देखने के लिए नियंत्रक खारिज:

self.dismissViewControllerAnimated(true) { 
    parentViewController.someMethod() 
} 
+0

मदद के लिए धन्यवाद: सैद्धांतिक रूप से यह अच्छा लग रहा है, लेकिन मुझे व्यावहारिक रूप से समस्याएं हैं :-)। मुझे त्रुटि मिलती है: vc में 'parentViewController' को असाइन नहीं किया जा सकता है। दूसरा: –

+0

क्या आपने व्यू कंट्रोलर को UIViewController के रूप में या UIViewController जैसे UIViewController के sublass के रूप में डाला था? यदि आप अपनी अतिरिक्त संपत्तियां चाहते हैं तो आपको इसे उपclass करना होगा। vc = storyboard.instantiateViewControllerWithIdentifier ("myChildView") को चलो! ** ChildViewController ** – chrisamanse

1
protocol SampleProtocol 
{ 
    func someMethod() 
} 


class parentViewController: SampleProtocol 
{ 
    // Conforming to SampleProtocol 
    func someMethod() { 
    } 
} 

class ChildViewController 
    { 
     var delegate:SampleProtocol? 
    } 

    self.dismissViewControllerAnimated(true, completion: nil) 
    delegate?.someMethod()