दिलचस्प पोस्ट
Android गतिविधि लेबल और लेबल बार कैसे अक्षम / निकालें? 3 डी प्लॉट का पहलू अनुपात सेट करना एक लूप के भीतर संशोधित एक चर याद नहीं है SQL सर्वर तालिका स्तंभ में एक स्ट्रिंग को कैसे बदलें UINavigationController "वापस बटन" कस्टम पाठ? एंड्रॉइड टुकड़ा वापस बटन प्रेस संभाल आंशिक दृश्य के रूप में बूटस्ट्रैप मोडल विंडो का उपयोग करना ExitCode प्रारंभ-प्रक्रिया का उपयोग करना और WaitForExit के बजाय- प्रतीक्षा करें रूबी मॉड्यूल में प्रत्येक विधि कॉल के लिए कोड कार्यान्वित करना Google मानचित्र एपीआई V3 पर क्लिक करें infoWindow या InfoBox के साथ ट्रिगर ईवेंट लेक्जर- और पार्सर नियमों के अंदर नज़र करना TextView Marquee काम नहीं कर रहा है क्यूटी क्रिएटर में पथ कैसे शामिल करें? बेस्ट प्रैक्टिस: सल्टिंग एंड पेपरिंग पासवर्ड? नेस्टेड एंकर टैग क्यों अवैध हैं?

दृश्यविशेषरूप देखें: निर्धारित करें कि नियंत्रक को पॉप किया जा रहा है या उप-दृश्य नियंत्रक दिखा रहा है या नहीं

मैं इस समस्या का एक अच्छा समाधान खोजने के लिए संघर्ष कर रहा हूं। नियंत्रक के दृश्य-दृश्य में -viewWillDisappear: विधि, मुझे यह तय करने का एक तरीका मिल सकता है कि यह क्या है क्योंकि एक दृश्य नियंत्रक को नेविगेशन नियंत्रक के स्टैक पर धकेल दिया जाता है, या यह इसलिए है क्योंकि दृश्य नियंत्रक गायब हो रहा है क्योंकि यह पॉप किया गया है।

फिलहाल मैं झंडे isShowingChildViewController रहा हूं जैसे कि isShowingChildViewController लेकिन यह काफी जटिल हो रहा है। एकमात्र तरीका मुझे लगता है कि मैं इसे का पता लगा सकता है -dealloc विधि में है

Solutions Collecting From Web of "दृश्यविशेषरूप देखें: निर्धारित करें कि नियंत्रक को पॉप किया जा रहा है या उप-दृश्य नियंत्रक दिखा रहा है या नहीं"

आप निम्नलिखित का उपयोग कर सकते हैं

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; NSArray *viewControllers = self.navigationController.viewControllers; if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) { // View is disappearing because a new view controller was pushed onto the stack NSLog(@"New view controller was pushed"); } else if ([viewControllers indexOfObject:self] == NSNotFound) { // View is disappearing because it was popped from the stack NSLog(@"View controller was popped"); } } 

यह निश्चित रूप से संभव है क्योंकि UINavigationController का दृश्य नियंत्रक स्टैक (दृश्य कंट्रोलर प्रॉपर्टी के माध्यम से अवगत कराया गया है) उस समय के द्वारा अपडेट किया गया है जब दृश्यविकल्प दिखाई देता है।

मुझे लगता है कि सबसे आसान तरीका है:

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([self isMovingFromParentViewController]) { NSLog(@"View controller was popped"); } else { NSLog(@"New view controller was pushed"); } } 

स्विफ्ट:

 override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { print("View controller was popped") } else { print("New view controller was pushed") } } 

UIViewController.h में एप्पल के प्रलेखन से:

"इन चार विधियों का उपयोग दृश्य नियंत्रक की उपस्थिति कॉलबैक में किया जा सकता है यह निर्धारित करने के लिए कि क्या इसे प्रस्तुत किया जा रहा है, खारिज किया जाता है, या जोड़ा जाता है या एक बच्चे को देखने नियंत्रक के रूप में हटा दिया जाता है। उदाहरण के लिए, एक दृश्य नियंत्रक यह जांच सकता है कि यह गायब हो रहा है क्योंकि यह खारिज कर दिया गया था या खुद को अपने विचार में पूछकर विस्फोट हो गयाआआआआआआआकार: अभिव्यक्ति की जांच करके विधि ([स्वयं है बिंगडिमिस्सेड]] [[आत्म हैडिंगफ्रैमपिवंट दृश्य नियंत्रक])। "

- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);

- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);

- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);

- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);

तो हां, ऐसा करने का एकमात्र दस्तावेज तरीका निम्न प्रकार है:

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([self isBeingDismissed] || [self isMovingFromParentViewController]) { } } 

स्विफ्ट 3 संस्करण:

 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.isBeingDismissed || self.isMovingFromParentViewController { } } 

यदि आप अभी जानना चाहते हैं कि आपका दृश्य पॉप हो रहा है या नहीं, तो मुझे पता चला है कि viewDidDisappearviewDidDisappear में nil , viewDidDisappear , जब इसे नियंत्रकों के ढेर से निकाल दिया जाता है तो यह एक साधारण वैकल्पिक परीक्षण है

(यह मुझे अन्य प्रकार के अन्य प्रकारों की कोशिश करने के बाद पता चलता है। मुझे आश्चर्य है कि UINavigationControllerDelegate पर अधिसूचित होने के लिए एक दृश्य नियंत्रक को पंजीकृत करने के लिए कोई नेविगेशन नियंत्रक प्रोटोकॉल नहीं है। आप UINavigationControllerDelegate उपयोग नहीं कर सकते क्योंकि वास्तव में वास्तविक डिस्प्ले काम होता है।)

स्विफ्ट में:

  override func viewWillDisappear(animated: Bool) { if let navigationController = self.navigationController { if !contains(navigationController.viewControllers as! Array<UIViewController>, self) { } } super.viewWillDisappear(animated) } 

स्विफ्ट 3

 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if self.isMovingFromParentViewController { //View Controller Popped } else { //New view controller pushed } } 

यह प्रश्न काफी पुराना है लेकिन मैंने इसे दुर्घटना से देखा है, इसलिए मैं सबसे अच्छा अभ्यास (एफ़िक) पोस्ट करना चाहता हूं

तुम बस कर सकते हो

 if([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) // view controller popped } 

यह iOS7 पर लागू होता है, कोई विचार नहीं है अगर यह किसी अन्य व्यक्ति पर लागू होता है मैं जो जानता हूं, देखने में viewDidDisappear कि दृश्य पहले से ही पॉप किया गया है। इसका अर्थ है कि जब आप self.navigationController.viewControllers तो आपको nil मिल जाएगा। तो बस जांचें कि क्या वह शून्य है

टी एल; डॉ

  - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if (self.navigationController.viewControllers == nil) { // It has been popped! NSLog(@"Popped and Gone"); } } 

IOS 6+ में इस समस्या को निपटाने का सेगेंस एक बहुत ही प्रभावी तरीका हो सकता है यदि आपने इंटरफ़ेस बिल्डर में एक विशिष्ट पहचानकर्ता को पहचान लिया है, तो आप इसके लिए तैयार कर सकते हैं prepareForSegue

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"LoginSegue"]) { NSLog(@"Push"); // Do something specific here, or set a BOOL indicating // a push has occurred that will be checked later } } 

मुझे लगता है कि इस पर एपल का दस्तावेज समझना मुश्किल है। यह एक्सटेंशन प्रत्येक नेविगेशन पर स्थित राज्यों को देखने में मदद करता है।

 extension UIViewController { public func printTransitionStates() { print("isBeingPresented=\(isBeingPresented)") print("isBeingDismissed=\(isBeingDismissed)") print("isMovingToParentViewController=\(isMovingToParentViewController)") print("isMovingFromParentViewController=\(isMovingFromParentViewController)") } } 

मुझे लगता है कि आप का मतलब है कि जब आप कहते हैं कि स्टैक पर धक्का दे रहे हैं, तो आपका दृश्य नेविगेशन नियंत्रक के स्टैक को एक नया दृश्य धक्का करके नीचे ले जाया जा रहा है। मैं कंसोल में कुछ लिखने के लिए एक NSLog स्टेटमेंट जोड़ने के लिए viewDidUnload विधि का उपयोग करने का सुझाव viewDidUnload ताकि आप देख सकें कि क्या चल रहा है, आप को देखने के लिए एक NSLog जोड़ना चाहते हैं viewWillDissappeer

यहां एक ही चीज़ को पूरा करने के लिए एक श्रेणी है, जैसे कि sbrocket के जवाब:

हैडर:

 #import <UIKit/UIKit.h> @interface UIViewController (isBeingPopped) - (BOOL) isBeingPopped; @end 

स्रोत:

 #import "UIViewController+isBeingPopped.h" @implementation UIViewController (isBeingPopped) - (BOOL) isBeingPopped { NSArray *viewControllers = self.navigationController.viewControllers; if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) { return NO; } else if ([viewControllers indexOfObject:self] == NSNotFound) { return YES; } return NO; } @end