2010-01-27 14 views
5

मैं अपने ऐप निब में निम्न चीज़ें हैं:viewDidAppear: कुछ शर्तों के तहत फायरिंग नहीं?

  • सामान्य: फ़ाइल का मालिक है, पहले प्रत्युत्तर खिड़की, प्रतिनिधि
  • देखें नियंत्रक "एक"
    • देखें "बी"
      • UIScrollView "सी"
      • "बी"
    • में कुछ अन्य सामान

मेरे AppDelegate applicationDidFinishLaunching में, मैं यह कर:

  1. [खिड़की makeKeyAndVisible]
  2. [खिड़की addSubView: a.view];
  3. बनाने के लिए एक दृश्य नियंत्रक "डी"
  4. साथ rootviewcontroller "डी"
  5. आह्वान एक navigationController "ई" बनाने के [ग addSubView: e.view]

प्रश्न/समस्या: जब मैं सब करने उपरोक्त में, viewDidAppear: "डी" के लिए फायरिंग नहीं है। (लेकिन देखेंडिडलोड आईएस फायरिंग है।) मैं कैसे पता लगा सकता हूं कि यह फायरिंग क्यों नहीं है, और इसे ठीक करें ताकि वह आग लगे?

(मैं क्यों viewDidAppear उपयोग करना चाहते हैं:। ऊपर कुछ श्रृंखलित एनिमेशन शामिल है और viewDidAppear, जब इसके दृश्य लोड किया गया है और एनिमेटेड पता करने के लिए तो यह बाद में एनिमेशन ट्रिगर कर सकते हैं एक दृश्य नियंत्रक के लिए एक अच्छी जगह की तरह दिखता है)

उत्तर

10

आमतौर पर जब आप दृश्य पदानुक्रम के साथ मैन्युअल रूप से खराब होते हैं तो आपको -viewWillAppear:, -viewDidAppear आदि नहीं मिलेगा; उन्हें -pushViewController:animated:, -presentModalViewController:animated:, और UITabBarController द्वारा एक टैब चयनित होने पर विभिन्न एसडीके विधियों द्वारा बुलाया जाता है।

जब आप पदानुक्रम के लिए कोई दृश्य जोड़ते हैं, तो यह ऑनस्क्रीन या ऑन-टू-ऑन-ऑनस्क्रीन हो सकता है या नहीं; -addSubview: विधि आपके इरादों के बारे में कोई धारणा नहीं बनाती है। जब आप दृश्य जोड़ते हैं तो बस स्वयं को कॉल करें।

+0

एक जवाब के रूप में इस रूप में चिह्नित किए स्पष्टीकरण समझ में आता है: मेरे UINavigationControllerDelegate तरीकों में तो, मैं कुछ इस तरह से किया था। अभी भी एनिमेशन के साथ कुछ क्रैश हो रहे हैं (उनके बिना कोई क्रैश नहीं), लेकिन शायद मेरे कोड में कुछ अन्य असंबद्ध अजीबता के कारण। – Jaanus

3

पहली बात यह है कि आपको पता होना चाहिए कि viewDidAppear UIViewController का एक तरीका है और UIView के नहीं, इसका वास्तव में विचारों से कोई लेना देना नहीं है।

दूसरी बात यह है कि एक समय में केवल एक "सक्रिय" UIViewController हो सकता है।

जब आप "एक" के दृश्य खिड़की में जोड़ने के लिए इसे सक्रिय UIViewController हो जाता है और केवल "एक" viewDidAppear संदेश जबकि "ई" वास्तव में किसी भी UIViewContoller संबंधित विधियों (viewDidAppear, viewWillAppear आदि हो रही नहीं किया जाएगा प्राप्त होगा ।)

@Noah जैसा कि बताया जा क्योंकि विधि "सक्रिय" UIViewController बनने के लिए धक्का दिया दृश्य नियंत्रक का कारण बनता है जब आप pushViewController का उपयोग आप ये संदेश प्राप्त होगा।

आप के लिए मेरे सुझाव है कि अगर आप बार देखा गया है कि कर रहे हैं subviews UIViewController बल्कि NSObject उपवर्ग नहीं है के लिए नियंत्रक बनाने के लिए, यह रूप में आप अपने UIViewController पद्धतियों को बुलाया प्राप्त करने की उम्मीद नहीं होंगे आपके भ्रम स्तर कम हो जाएगा है जो वे जीत लिया ' वैसे भी।

+1

मुझे यहां एक समस्या थी जहां आईओएस 5 डिवाइस पर viewDidAppear को बुलाया गया था लेकिन आईओएस 4 डिवाइस नहीं। नियंत्रक ए से एक एनवी नियंत्रक का उपयोग करना, मैं एक सामान्य सामान्य तरीके से नियंत्रक बी को दबा रहा था। मुझे यकीन नहीं है कि अगर यह समझ में आता है लेकिन मैं कंट्रोलर बी के अंदर नियंत्रक बी के संदर्भ को भी संग्रहीत कर रहा हूं (आमतौर पर मैं केवल एनएवी नियंत्रक को नियंत्रकों पर टैब रखना चाहता हूं)। मैं नियंत्रक बी में देखने के लिए कुछ कोड पर निर्भर था, जैसे ही इसे प्रदर्शित किया गया था, लेकिन हां यह कम से कम आईओएस 4.3 में टूट गया। मैंने viewDidAppear का उपयोग करना बंद कर दिया और बस '- (शून्य) शुरू किया;' नियंत्रक बी में धक्का देने के बाद कॉल करने के लिए। – Jonny

1

जब मैंने अपने नेविगेशन नियंत्रक के प्रतिनिधि को सेट किया तो मुझे एक ही समस्या थी।

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    //do something here 
    [viewController viewWillAppear:animated]; 
} 

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [viewController viewDidAppear:animated]; 
} 
संबंधित मुद्दे