Intereting Posts
एकाधिक SKPaymentTransaction कर्सर UITextView में दिखाई नहीं दे रहा है क्या मैं NSAttributedString में तत्वों की स्थिति प्राप्त कर सकता हूं? ओएस एक्स पर ndenv का उपयोग करते हुए प्रतिक्रिया मूल निवासी के सेटअप आईओएस: मल्टीलाइन यूआबेलेबल केवल ऑटो लाइन के साथ एक पंक्ति दिखाता है आईओएस 6 पर स्मार्ट ऐप बैनर छिपाए बिना पता बार छिपा रहा है कैसे UITextView में दृश्यमान शब्दों के लिए सीजीआरएक्टर्स को कुशलता से ढूंढें? एनएसओपरेशन में प्रतिनिधियों का उपयोग आईपेज रेटिना नमूना (जीएलग्रीविटी) के लिए 1536×2048 फ़्रेमबफर कैसे बनाएं आईफ़ोन पर आधारित छवि का अनुपात कैसे उपयोग करें I स्ट्रिंग /। टेक्स्ट की अधिकतम लंबाई निर्धारित करना आप UITableView से चयनित पंक्तियों को कैसे प्राप्त कर सकते हैं? RxSwift पुनः लोड करें tableview स्विफ्ट में रूट दृश्य नियंत्रक को प्रोग्रामैटिक रूप से सेट करना छवि खोज API

आईओएस प्रोग्रामिंग का पता लगाने के लिए कैसे शीर्ष दृश्य नियंत्रक पॉप है?

मान लीजिए मेरे पास 2 दृश्य नियंत्रकों के साथ एक एनएवी नियंत्रक स्टैक है: VC2 शीर्ष पर है और VC1 नीचे है। क्या कोई ऐसा कोड है जो मैं वीसी 1 में शामिल कर सकता हूं जो कि पता लगाएगा कि वीसी 2 को सिर्फ ढेर से हटा दिया गया है?

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

संपादित करें: ऐसा लगता है कि मैं अपने मूल प्रश्न से बहुत स्पष्ट नहीं था। यह है कि मैं क्या करने की कोशिश कर रहा हूं: निर्धारित करें कि जब वीसी 1 को ढेर के ऊपर बंद किया गया है, तो वीसी 1 के कारण दिखाया जा रहा है। यह है जो मैं करने की कोशिश नहीं कर रहा हूं: निर्धारित करें कि जब वीसी 1 को ढेर के ऊपर धकेल दिया जाने के कारण दिखाया जा रहा है। मुझे किसी तरह की ज़रूरत है जो पहले कार्रवाई का पता लगाएगी लेकिन दूसरी कार्रवाई नहीं होगी

नोट: मुझे विशेष रूप से वीसी 2 के बारे में परवाह नहीं है, यह अन्य कई वीसी हैं जो स्टैक बंद हो जाते हैं, मुझे क्या करना पड़ता है, जब किसी अन्य वीसी की वजह से वीसी 1 फिर से ढेर के ऊपर हो जाता है, शीर्ष।

Solutions Collecting From Web of "आईओएस प्रोग्रामिंग का पता लगाने के लिए कैसे शीर्ष दृश्य नियंत्रक पॉप है?"

आईओएस 5 ने इस प्रकार की स्थिति को संभालने के लिए दो नए तरीके पेश किए। आप जो देख रहे हैं -[UIViewController isMovingToParentViewController] डॉक्स से :

isMovingToParentViewController

एक बूलियन मान देता है जो दर्शाता है कि नियंत्रक एक अभिभावक के साथ जोड़े जाने की प्रक्रिया में है।

- (BOOL)isMovingToParentViewController

प्रतिलाभ की मात्रा
हां, यदि दृश्य नियंत्रक दिखाई दे रहा है क्योंकि इसे कंटेनर व्यू नियंत्रक के एक बच्चे के रूप में जोड़ा गया था, अन्यथा नहीं।

विचार-विमर्श
यह पद्धति केवल तब देता है जब निम्न विधियों के अंदर से बुलाया जाता है:

-viewWillAppear:
-viewDidAppear:

आपके मामले में आप कार्यान्वित कर सकते हैं – -viewWillAppear: जैसे:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (self.isMovingToParentViewController == NO) { // we're already on the navigation stack // another controller must have been popped off } } 

संपादित करें: यहां पर विचार करने के लिए एक सूक्ष्म अर्थ अंतर है- क्या आप इस तथ्य में रुचि रखते हैं कि विशेष रूप से वीसी 2 ने स्टैक बंद कर दिया है, या क्या आपको हर बार वीसी 1 को अधिसूचित करना है, जो कि किसी भी नियंत्रक का परिणाम है? पूर्व मामले में, प्रतिनिधिमंडल एक बेहतर समाधान है। वीसी 1 के लिए एक सीधा-अप कमजोर संदर्भ भी काम कर सकता है यदि आप वीसी 2 पर पुनः उपयोग करने का इरादा नहीं करते हैं

2 संपादित करें: मैं तर्क को उलटा करके और प्रारंभिक रूप से नहीं लौटकर उदाहरण को और स्पष्ट करता हूं।

isMovingTo / FromParentViewController एक नेविगेशन नियंत्रक स्टैक में धक्का और पॉपिंग के लिए काम नहीं करेगा।

यह ऐसा करने का एक विश्वसनीय तरीका है (प्रतिनिधि का उपयोग किए बिना), लेकिन शायद यह संभवतः आईओएस 7+ है

 UIViewController *fromViewController = [[[self navigationController] transitionCoordinator] viewControllerForKey:UITransitionContextFromViewControllerKey]; if ([[self.navigationController viewControllers] containsObject:fromViewController]) { //we're being pushed onto the nav controller stack. Make sure to fetch data. } else { //Something is being popped and we are being revealed } 

मेरे मामले में, प्रतिनिधि का उपयोग करने का अर्थ होगा कि नियंत्रक के व्यवहार को एनएवी स्टैक के मालिक के प्रतिनिधि के साथ कसकर मिलकर जोड़ा जाना चाहिए, और मैं एक और एक स्टैंडअलोन समाधान चाहता था। यह काम।

आप जिस तरह से संपर्क कर सकते हैं, वैसे ही वीसी 2 के लिए एक प्रतिनिधि प्रोटोकॉल को इस तरह से घोषित करना होगा:

वीसी 1 एच में

 @interface VC1 : UIViewController <VC2Delegate> { ... } 

वीसी 1 में

 -(void)showVC2 { VC2 *vc2 = [[VC2 alloc] init]; vc2.delegate = self; [self.navigationController pushViewController:vc2 animated:YES]; } -(void)VC2DidPop { // Do whatever in response to VC2 being popped off the nav controller } 

वीसी 2 एच में

 @protocol VC2Delegate <NSObject> -(void)VC2DidPop; @end @interface VC2 : UIViewController { id<VC2Delegate> delegate; } @property (nonatomic, assign) id delegate; ... @end 

VC2.m

 -(void)viewDidUnload { [super viewDidUnload]; [self.delegate VC2DidPop]; } 

यहां प्रोटोकॉल और प्रतिनिधियों की मूल बातें पर एक अच्छा लेख है ।

आप उस दृश्य नियंत्रक में भी पता लगा सकते हैं जिसे पॉप किया जा रहा है

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

यह मेरे लिए काम किया है

 UIViewController *fromViewController = [[[self navigationController] transitionCoordinator] viewControllerForKey:UITransitionContextFromViewControllerKey]; if (![[self.navigationController viewControllers] containsObject:fromViewController] && !self.presentedViewController) { //Something is being popped and we are being revealed } 

आप विशेष रूप से क्या करने की कोशिश कर रहे हैं?

यदि आप यह पता लगाने की कोशिश कर रहे हैं कि वीसी 1 दिखाए जाने के बारे में है, तो यह उत्तर आपकी मदद कर सकता है। UINavigationControllerDelegate का उपयोग करें

अगर आप यह पता लगाने की कोशिश कर रहे हैं कि वीसी 2 छिपी हुई है, तो मैं सिर्फ viewWillDisappear: उपयोग कर viewWillDisappear: वीसी 2 का

आप NSNotification के लिए एक पर्यवेक्षक को विशेष रूप से अपने वीसी 2 के लिए जोड़ सकते हैं।

 // pasing the "VC2" here will tell the notification to only listen for notification from // VC2 rather than every single other objects [[NSNotitificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) object:VC2]; 

अब आपके वीसी 2 के दृश्य में गायब हो जाएगा, आप एक सूचना पोस्ट कर सकते हैं:

 -(void)viewWillDisappear { [[NSNotificationCenter defaultCenter] postNotificationNamed:@"notif_dismissingVC2" object:nil]; } 

तेज 3

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if self.isMovingToParentViewController { print("View is moving to ParentViewControll") } } 

मुझे एक ही स्थिति मिली, लेकिन थोड़ी अधिक विशिष्ट उपयोग के मामले के साथ। मेरे मामले में हम यह निर्धारित करना चाहते थे कि वीसी 2 के पीछे वाले बटन पर उपयोगकर्ता के नल पर वीसी 1 प्रदर्शित होने पर प्रदर्शित किया जाता है, जहां वीसी 2 ने नेविगेशन पर धकेल दिया है।

इसलिए मैंने अपनी ज़रूरत के मुताबिक स्नैर्शद के उत्तर की मदद से अनुकूलित किया था। यहां वीसी 1 के viewDidAppear में कोड है स्विडिश 3 में viewDidAppear

 // VC1: ParentViewController // VC2: ChildViewController override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let transitionCoordinator = navigationController?.transitionCoordinator, let fromVC = transitionCoordinator.viewController(forKey: UITransitionContextViewControllerKey.from), let toVC = transitionCoordinator.viewController(forKey: UITransitionContextViewControllerKey.to), fromVC is ChildViewController, toVC is ParentViewController { print("Back button pressed on ChildViewController, and as a result ParentViewController appeared") } } 

हां, वीसी 1 में आप जांच सकते हैं कि क्या वीसी 2 पॉप है या नहीं। UINavigationController एक विधि दृश्य नियंत्रक है जो धकेल दिया नियंत्रकों की सरणी देता है, जो स्टैक में हैं (जो कि धकेल दिया गया है)।

तो आप कक्षा की तुलना करके लूप के माध्यम से पुनरावृत्त करें। यदि वीसी 2 है, तो मैच होगा, अन्यथा नहीं।