2010-08-24 19 views
36

फायरिंग नहीं की जा रहीviewWillAppear, viewDidAppear, नहीं कहा जाता

लक्षण (यह दोनों सवाल-जवाब के बाद से यह काफी वास्तविक जवाब खोजने के लिए खुदाई का एक सा ले लिया है।): viewWillAppear, viewDidAppear मेरी UIViewController में नहीं बुलाया जा रहा था ।

कारण: UINavigationController या UITabBarController (मेरा मामला) UIViewController में एम्बेड करना इन तरीकों के कॉलिंग के साथ किसी भी तरह बाधा डालता है।

समाधान: उन्हें UIViewController में मैन्युअल रूप से कॉल करें जिसमें उपरोक्त UINavigationController/UITabBarController शामिल है।

उदाहरण के लिए (यह मानते हुए projectNavigationController अपने UINavigationController है):

 
-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [projectNavigationController viewWillAppear:animated]; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [projectNavigationController viewWillDisappear:animated]; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [projectNavigationController viewDidAppear:animated]; 
} 

-(void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    [projectNavigationController viewDidDisappear:animated]; 
} 

मेरे मामले में मैं एक आंतरिक UITabBarController थी और मैं उसके अनुसार पद्धतियों को बुलाया और सभी हल किया गया था।

(समाधान पर रोपण: http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/)

+1

सिर्फ इसलिए कि मैं उत्सुक हूं ...: आप एक टैब बार नियंत्रक को किसी अन्य व्यू कंट्रोलर में क्यों लपेटेंगे? :) ज्यादातर मामलों में, वे दृश्य (नियंत्रक) पदानुक्रम की जड़ हैं ... – Toastor

+0

+1 .. वास्तव में मेरी समस्या हल हो गई .. चीयर्स –

उत्तर

9

मैं आगे जाना है और इससे सहमत नहीं करने जा रहा हूँ के साथ @ St3fan, और जवाबी उदाहरण के रूप में UIKit का उपयोग करें।

हालांकि, सामान्य रूप से एम्बेडिंग नियंत्रकों के ज्ञान (या इसकी कमी) को सीआईआई यूआई डिज़ाइन सिद्धांतों द्वारा निर्देशित किया जाना चाहिए।

सबसे आसान जवाबी उदाहरण UINavigationControllersUITabBarControllers में एम्बेडेड है। ये सब जगह पर दिखाई देते हैं। मेरे सिर के शीर्ष पर, आईफोन पर आईपॉड ऐप, और आईफोन पर फोन ऐप के अंदर संपर्क।

मैं यह देखने के लिए परेशान था कि वे "सुपर-कंट्रोलर" दृश्य में जोड़ें या UIWindow पर जोड़ें। मुझे पूरा यकीन था कि उप-नियंत्रक विचार वंशज थे दृश्य पदानुक्रम में सुपर-कंट्रोलर विचारों के विपरीत, जो St3fan की सिफारिश के विपरीत है।

मैंने इंटरफ़ेसबिल्डर में सबकुछ एक बहुत तेज़ आईफोन ऐप को हुकिंग करने के लिए UITabBarController आधारित ऐप दो टैब के साथ बनाया, जिसमें से पहला था UINavigationController सादा ओले UIViewController के साथ यह रूट व्यू कंट्रोलर है, और एक सादा पुराना UIViewController वाला दूसरा टैब बस इतना है कि मेरे पास बाद में क्लिक करने के लिए दूसरा टैब था।

नियंत्रकों हम यह देखने के लिए उत्पादन विभिन्न UIView's करने के लिए कुछ NSLog बयान में

छिड़ककर:

tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ... 
navigationController.view = <UILayoutContainerView: 0x59469a0; ... 
rootViewController.view = <UIView: 0x594bb70; ... 
Superview: <UIViewControllerWrapperView: 0x594cc90; ... 
Superview: <UINavigationTransitionView: 0x594a420; ... 
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view 
Superview: <UIViewControllerWrapperView: 0x594b430; ... 
Superview: <UITransitionView: 0x5b0e110; ... 
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view 
Superview: <UIWindow: 0x5942a30; ... 

लाइनों "Superview" उपसर्ग के साथ शून्य से टकराने जब तक rootViewController.view's superview श्रृंखला चलने से उत्पादन कर रहे थे।

फिर निश्चित रूप से दो स्थानों में कॉल स्टैक पर एक त्वरित नज़र जहां viewDidDisappear रूट व्यू कंट्रोलर पर कॉल किया जाएगा।

पहले, कॉल स्टैक जब viewDidDisappear एक नया नियंत्रक का एक परिणाम के रूप में जड़ नियंत्रक पर कहा जाता है ढेर करने पर धक्का दे दिया जा रहा है:

-[RootController viewDidDisappear:] 
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] 
... 

दूसरा, कॉल स्टैक जब किसी अन्य टैब में चयन किया जाता है सर्वोच्च UITabBarController:

-[RootController viewDidDisappear:] 
-[UINavigationController viewDidDisappear:] 
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:] 
सभी मामलों में

तो, ऐसा लगता है एप्पल फैसला किया है कि कि नियंत्रक विभिन्न viewDidAppear बुला किया जाना चाहिए, उनके एम्बेडेड subcontrollers पर और कहा कि आदि तरीकों को देखने के समान एम्बेड किए जाने चाहिए ly। मुझे लगता है कि अगर हम UIKit डिजाइन को पालन करने के लिए एक अच्छे नेतृत्व के रूप में लेते हैं तो ओपी ने इस नाखून को सीधे सिर पर मारा।

+0

दिलचस्प विश्लेषण imaginaryboy। मैं आपके पीओवी St3fan की सराहना करता हूं। सामान्य सेटअप में, UITabBarController (जिसमें इसका स्वयं का नेविगेशन नियंत्रक और नियंत्रक देखें) विंडो में जोड़ा जाता है। इसे देखना बहुत आसान है। हालांकि, मेरी स्थिति थोड़ा अलग थी। मेरे मामले में उपयोगकर्ता एक मोडल के माध्यम से आवेदन के एक विशिष्ट मोड में प्रवेश करता है। इस अन्य मोड में, उपयोगकर्ता मूल रूप से देखे जाने वाले एक अलग UITabBarController है। शायद मैं नए UITabBarcontroller को विंडो (?) में जोड़ने के लिए ऐप प्रतिनिधि को बुला सकता था लेकिन इसे मोडल UIViewController में जोड़ना आसान था। – pschang

0

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

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

#warning I SHOULD NOT HAVE TO DO THIS!!

मैं segue कोड breakpointed और, यकीन है कि पर्याप्त, आईबी segue अब काम कर रहा था, और यह टेबल सेल चयन कोड में मेरा मैनुअल ऑपरेशन था जो कॉल किए गए दृश्य में प्रतिनिधि कॉल को गड़बड़ कर रहा था। मैंने मैन्युअल कोड हटा दिया और सब कुछ ठीक है।

यह अजीब लगता है कि दृश्य को धक्का देने के बाद सेल चयन कोड कहा जाता है। मुझे कॉलर में चयनित सेल के इंडेक्सपाथ प्राप्त करने के लिए प्रोटोकॉल और प्रतिनिधि करना है।

संबंधित मुद्दे