जबकि viewWillAppear()
और viewDidDisappear()
कर रहे हैं जब वापस बटन उपयोग किया जाता है कहा जाता है, वे भी अन्य समय में कहा जाता है। उस पर अधिक के लिए उत्तर का अंत देखें।
UIViewController.parent का उपयोग करना
जब वीसी को माता-पिता (नेवीकंट्रोलर) से हटा दिया जाता है तो willMoveToParentViewController(_:)
ओआर की मदद से बैक बटन का पता लगाना बेहतर होता हैdidMoveToParentViewController()
यदि अभिभावक शून्य है, तो व्यू कंट्रोलर को नेविगेशन स्टैक से हटा दिया जाता है और खारिज कर दिया जाता है। यदि माता-पिता शून्य नहीं हैं, तो इसे स्टैक में जोड़ा जा रहा है और प्रस्तुत किया गया है।
// Objective-C
-(void)willMoveToParentViewController:(UIViewController *)parent {
[super willMoveToParentViewController:parent];
if (!parent){
// The back button was pressed or interactive gesture used
}
}
// Swift
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
// The back button was pressed or interactive gesture used
}
}
बाहर स्वैप willMove
के लिए didMove
और जांच self.parent काम करने के लिए के बाद दृश्य नियंत्रक को खारिज कर दिया है।
बर्खास्तगी को रोक रहा है
ध्यान दें, यदि आपको कुछ प्रकार के एसिंक्स सेव करने की आवश्यकता है, तो माता-पिता की जाँच आपको संक्रमण को "रोक" देने की अनुमति नहीं देती है। ऐसा करने के लिए आप निम्नलिखित को लागू कर सकते हैं। केवल यहाँ नकारात्मक पक्ष यह है कि आप फैंसी आईओएस स्टाइल / एनिमेटेड बैक बटन खो सकते हैं। इंटरेक्टिव स्वाइप जेस्चर के साथ यहां भी सावधान रहें। इस मामले को संभालने के लिए निम्नलिखित का उपयोग करें।
var backButton : UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
// Disable the swipe to make sure you get your chance to save
self.navigationController?.interactivePopGestureRecognizer.enabled = false
// Replace the default back button
self.navigationItem.setHidesBackButton(true, animated: false)
self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
self.navigationItem.leftBarButtonItem = backButton
}
// Then handle the button selection
func goBack() {
// Here we just remove the back button, you could also disabled it or better yet show an activityIndicator
self.navigationItem.leftBarButtonItem = nil
someData.saveInBackground { (success, error) -> Void in
if success {
self.navigationController?.popViewControllerAnimated(true)
// Don't forget to re-enable the interactive gesture
self.navigationController?.interactivePopGestureRecognizer.enabled = true
}
else {
self.navigationItem.leftBarButtonItem = self.backButton
// Handle the error
}
}
}
अधिक देखने पर / दिखाई देगा
यदि आपको viewWillAppear
viewDidDisappear
समस्या नहीं मिली , तो आइए एक उदाहरण के माध्यम से चलते हैं। कहते हैं कि आपके पास तीन दृश्य नियंत्रक हैं:
- ListVC: चीजों का एक टेबल व्यू
- DetailVC: एक चीज़ के बारे में विवरण
- SettingsVC: एक चीज के लिए कुछ विकल्प
के detailVC
रूप में आप से और वापस करने के listVC
लिए जाने पर कॉल का पालन करेंsettingsVC
listVC
सूची> डिटेल (पुश डिटेलवी) Detail.viewDidAppear
<-
डिटेल> सेटिंग्स (पुश सेटिंग्सवीसी) Detail.viewDidDisappear
<- गायब दिखाई दें
और जैसा कि हम वापस जाते हैं ...
सेटिंग्स> विवरण (पॉप सेटिंग्सवीसी) Detail.viewDidAppear
<-
विवरण> सूची (पॉप विवरणवीवीसी) Detail.viewDidDisappear
<- गायब दिखाई दें
नोटिस जो viewDidDisappear
कई बार कहा जाता है, न केवल जब वापस जा रहा है, बल्कि आगे बढ़ने पर भी। एक त्वरित ऑपरेशन के लिए जिसे वांछित किया जा सकता है, लेकिन अधिक जटिल ऑपरेशन के लिए जैसे नेटवर्क कॉल को सहेजना है, यह नहीं हो सकता है।