2010-12-03 17 views
15

एक UIViewController उपclass में, मेरे पास निम्न विधियां हैं:UIViewController: viewWillAppear कहा जाता है, viewDidAppear नहीं

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // do something 
    myTextField.text = @"Default"; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // do something 
    [myTextField selectAll:self]; 
    [myTextField becomeFirstResponder]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad];  
    // do something 
    myTextField.delegate = self; 
} 

एनआईबी इंटरफ़ेस बिल्डर का उपयोग करके बनाया गया है। इसी दृश्य नियंत्रक ऑब्जेक्ट को pushViewController के माध्यम से नेविगेशन नियंत्रक द्वारा धक्का दिया जाता है।

इरादा व्यवहार पूरे पाठ का चयन करने के लिए और टेक्स्ट फ़ील्ड को पहले उत्तरदाता के रूप में सेट करने के लिए, टेक्स्ट फ़ील्ड में एक डिफ़ॉल्ट टेक्स्ट प्रविष्टि दिखाने के लिए है। [संपादित करें: मैंने देखा है कि सभी और को चुनने से पहले उत्तरदाता को कोई समझ नहीं आता क्योंकि चयन गायब हो जाएगा; फिर भी, मुझे आश्चर्य है कि तरीकों का वर्णन अगले तरीके के रूप में क्यों किया जाता है।]

हालांकि, जबकि विधियों को देखते हैंडलोड और देखेंविलपियर को कॉल किया जाता है, विधि दृश्यडिडएपियर को नहीं कहा जाता है। क्या कोई मुझे बता सकता है क्यों? वेब पर मिले अधिकांश प्रश्न और यहां दोनों व्यूविल्लियर/व्यूडिडएपियर के साथ सौदा नहीं कर रहे हैं; मैंने यह भी समझा कि सबव्यूज़ या प्रोग्रामेटिक रूप से बनाए गए विचारों में इन विधियों को विकसित नहीं किया गया है; लेकिन यह मामले में लागू नहीं होता है और मुझे आश्चर्य है कि इन "जीवन चक्र" विधियों में से एक क्यों विकसित हुआ है और दूसरा नहीं।

कोई विचार? धन्यवाद!

उत्तर

0

viewDidAppear: पर कॉल हमेशा viewWillAppear: का पालन करना चाहिए जबतक कि आप कुछ कस्टम नहीं कर रहे हैं, जो आप कहते हैं कि आप नहीं करते हैं। मुझे नहीं पता कि यह क्यों काम नहीं करता है लेकिन यहां कुछ विचार हैं:

क्या यह हो सकता है कि आप UITextFieldDelegate के लिए प्रतिनिधि विधियों में से किसी एक में अजीब कर रहे हैं? यह असंभव है कि यह viewDidAppear: को प्रभावित करेगा, लेकिन यह एक अपराधी हो सकता है।

क्या आपने दृश्य को धक्का देने से पहले स्मृति में बहुत सी चीजें लोड की हैं? मुझे यकीन नहीं है कि अगर आपको viewWillAppear: और viewDidAppear: के बीच मेमोरी चेतावनी मिली तो क्या होगा।

क्या आपने क्लीन करने की कोशिश की है? कभी-कभी वह मदद कर सकता है।

इस तरह के मामलों में जब इसे काम करना चाहिए तो मैं आम तौर पर एक नई कक्षा बनाता हूं और यह देखने के लिए कार्यक्षमता को पेश करता हूं कि मैं इसे इस तरह से काम कर सकता हूं या नहीं। मैंने आपके कोड को एक नई नेविगेशन आधारित परियोजना में आजमाया जहां मैंने टेक्स्ट फ़ील्ड के आउटलेट के साथ एक नया UIViewController जोड़ा। तब मैंने सवाल से कोड चिपकाया और यह उम्मीद के अनुसार काम किया।

+0

कोई स्मृति समस्या नहीं होनी चाहिए, कम से कम किया गया ReceiveMemoryWarning नहीं कहा जाता है। एक साफ सभी लक्ष्यों की मदद नहीं की। इसलिए मैंने आपकी सलाह का पालन किया और मैंने एक नई परियोजना में कक्षा की "प्रतिलिपि बनाई"। और यह काम करता है। : -/मैंने अपनी मूल कक्षा में ओवरराइड किए गए सभी तरीकों को जोड़ा है और एक प्रोजेक्ट में यह काम करता है, दूसरे में यह नहीं है। दोनों स्थितियों में दृश्य NavVcontroller पर pushViewController द्वारा दिखाया गया है। केवल अंतर: परीक्षण प्रोजेक्ट में एक एनवी कंट्रोलर है, मेरे प्रोजेक्ट में तीन हैं (रूट कंट्रोलर एक टैबबार कंट्रोलर है) –

+0

@sven - मैं नेविगेशन बार के शीर्षक दृश्य को बदलना चाहता हूं। ऐसा लगता है कि दृश्यविल्लियर ट्रिगर होने पर दृश्य को अभी तक नेविगेशन बार पर धक्का नहीं दिया गया है। – OmniBus

16

मुझे यह समस्या मेरे साथ हुई: viewWillAppear कहा जा रहा था लेकिन viewDidAppear नहीं था!

मैं अंत में पता लगा है कि इस क्योंकि मैं एक tabBarController था मैं कहाँ अतिभारित यह खुद viewDidAppear है और भूल गया [super viewDidAppear:animated];

यह हर टैब में हर VC बंद फेंक दिया था! उस लाइन को मेरे अन्य VC's के लिए तय करने में वापस जोड़ना।

उम्मीद है कि यह किसी की मदद करेगा!

+0

यह मेरे स्विफ्ट प्रोजेक्ट में मेरे लिए सही मामला था। धन्यवाद! –

0

मुझे एक ही समस्या थी।

मैंने viewWillAppear बनाने के लिए viewDidAppear कॉपी/पेस्ट किया था लेकिन super.viewDidAppear() कॉल को बदलना भूल गया था। यह तब कहा जाता है कि viewDidAppear को बुलाया जा रहा है।

ऐसा लगता है कि आपके कोड में कहीं कहीं याद आया है या आपने सुपरक्लास को कॉल किया है।

0

ऐसा इसलिए हो सकता है क्योंकि आपने viewDidLoad या viewWillAppear में अपने मूल वीसी में एक बाल दृश्य नियंत्रक जोड़ा है। बच्चे की उपस्थिति कॉल को viewDidAppear पर रोकती है।

यह करने के लिए एक पागल चीज है, और मुझे केवल इतना पता है क्योंकि यह मेरे कोड में एक बग था। मेरा मतलब यह वीसी में बाल वीसी जोड़ना था, न कि माता-पिता वीसी।

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