UIViewController बारी बारी से तरीकों

वोट
17

क्या वस्तु dipatching के लिए जिम्मेदार है UIViewControllerरोटेशन विधि कॉल, अर्थात्:

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

मुझे लगता है यह है UIApplication(लेकिन शायद AppDelegate या UIWindow)।

अगला प्रश्न, कैसे वस्तु जो जान लेता है है UIViewControllerबात करने के लिए?

यह कैसे पता चलेगा कि जो करता है UIViewControllerखिड़की के subview के रूप में अपनी दृश्य है?

वहाँ है कि सेट सक्रिय संदेश आप भेज सकते हैं या एक संपत्ति (किसी वस्तु का) आप सेट कर सकते है UIViewControllerअनुप्रयोग के लिए?

14/02/2009 को 00:50
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
13

ऐसा नहीं है कि लगता है UIApplicationसक्रिय दृश्य नियंत्रक के लिए एक संदेश भेजने रहा है।

लेकिन यह कैसे अपने दृश्य नियंत्रक उदाहरण इन संदेशों को प्राप्त करता है?

संदेश पहला दृश्य नियंत्रक जिसका देखने के लिए जोड़ दिया गया है को भेजा जाता है UIWindowउदाहरण।

यह 3 बुनियादी परिदृश्यों करने पर निर्भर करता:

  1. ViewController जिसका दृश्य के लिए सीधे जोड़ा जाता है UIWindow उदाहरण (एकल दृश्य एप्लिकेशन)

  2. एक नेविगेशन आधारित अनुप्रयोग में नेविगेशन नियंत्रक, तो नेविगेशन नियंत्रक सक्रिय दृश्यों के लिए संदेश नियंत्रक देखने अग्रेषित करता है।

  3. एक टैब बार आधारित अनुप्रयोग में टैब बार नियंत्रक, तो टैब बार नियंत्रक सक्रिय दृश्यों के लिए संदेश नियंत्रक (या सक्रिय नेविगेशन नियंत्रक) देखने अग्रेषित करता है।

समस्या आप होगा, यदि आप कई विचारों के साथ एक ऐप्लिकेशन बनाएं, लेकिन एक नेविगेशन नियंत्रक या टैब बार नियंत्रक का उपयोग नहीं करते है। आप विचारों में और के बाहर स्वैप तो UIWindowमैन्युअल रूप से उदाहरण के लिए, आप इन संदेशों मज़बूती से प्राप्त नहीं होगा। यह इस तरह से पोस्ट के समान है: iPhone viewWillAppear फायरिंग नहीं

बस ऐसे कई दृश्य के लिए एप्पल के सम्मेलनों का उपयोग करें और आप ठीक हो। उम्मीद है कि यह कुछ एक एक या दो घंटे की बचत होती है

19/02/2009 को 05:49
का स्रोत उपयोगकर्ता

वोट
4

यह कैसे पता चलेगा कि जो UIViewController खिड़की के subview के रूप में अपनी दृश्य है करता है?

UIViewController वर्ग विचारों और उनके विचार नियंत्रकों के बीच एक स्थिर नक्शा बनाए रखता है। इस नक्शे CocoaTouch अंदर कुछ प्रमुख स्थानों में क्वेरी की जाती है। विशेष रूप से, [UIView nextResponder] यह प्रश्नों और नियंत्रक वापस लौट आता है पाया।

मैं UIWindow उसकी जड़ दृश्य को पता है जो नियंत्रक से रोटेशन घटनाओं को अग्रेषित करने के साथ ही देखने करता है लगता है। इस अगली बार मैं disassembly में कुछ प्रयास करेंगे की जाँच करेगा। (मैं समझने के लिए कैसे चीजें वहाँ काम कुछ समय के रिवर्स इंजीनियरिंग CocoaTouch खर्च किया है।)

06/05/2009 को 12:15
का स्रोत उपयोगकर्ता

वोट
4

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

(लेकिन अगर आप डीबगर के साथ चारों ओर से प्रहार, आप एक ही निष्कर्ष मैं करने के लिए आ सकता है:। वहाँ आंतरिक तालिका प्रत्येक नियंत्रक के दृश्य नियंत्रक करने के लिए वापस मानचित्रण के कुछ प्रकार है, और संदेशों उस लिंक पर आधारित भेज दिया जाता है)


अद्यतन: यह 2009 में सही मायने में निजी जादू था जब मैं पहली बार इस सवाल का जवाब लिखा था, लेकिन आईओएस के लिए बाद में परिवर्तन सार्वजनिक इसके पीछे एपीआई बना दिया है। रूट दृश्य नियंत्रक अब के माध्यम से पहुँचा जा सकता है UIWindow.rootViewControllerसंपत्ति, और वंशज दृश्य नियंत्रकों के पेड़ का उपयोग कर बनाई है UIViewController.childViewControllersसंपत्ति।

जनक दृश्य नियंत्रकों उन्मुखीकरण परिवर्तन के अपने बच्चों को अधिसूचित करने के लिए जिम्मेदार हैं। (मुझे यकीन है कि कैसे रूट दृश्य नियंत्रक अधिसूचित किया गया है नहीं कर रहा हूँ, लेकिन आप एक ब्रेकपाइंट सेट और अपने आप को यह पता लगाने सकता है।) -shouldAutomaticallyForwardRotationMethodsविधि निर्णय लेता है कि UIViewController आपके लिए यह कार्य होगा। यदि यह रिटर्न NO, आप अपने में ऐसा करने के लिए जिम्मेदार हो जाते हैं -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:और -didRotateFromInterfaceOrientation:तरीकों।

14/02/2009 को 01:42
का स्रोत उपयोगकर्ता

वोट
1

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

मैं एक खेल लैंडस्केप ओरिएंटेशन (दोनों बाएँ और दाएँ परिदृश्य) में काम कर रहा है।

आदेश मैं एक रूट UIViewController का उपयोग एक बहु दृश्य आवेदन का प्रबंधन करने के लिए, एक UIView कि कुछ नहीं करता है के साथ एक डमी UIViewController अर्थात्। मैं तो एक subview के रूप में यह करने के लिए हर दूसरे UIView जोड़ें।

जब अनुप्रयोग शुरू करने, एमुलेटर जल्दी से एक पोर्ट्रेट अभिविन्यास में घूमता है, और मैं इसे का फ्रेम संपत्ति (0, -+८०३२०४८०) की तरह लग रही के साथ अपने विचार से हर एक मिलता है। ध्यान में रखते हुए यह परिणाम सही पक्ष पर एक 160 X 320 आयत द्वारा काटा जा रहा है।

मुझे लगता है कि ध्यान दिया है - shouldAutorotateToInterfaceOrientation: प्रत्येक subview की विधि केवल एक बार कहा जाता है, और जब यह रूट दृश्य में जोड़ दिया जाता है कि क्या होता है। बाद में, जब डिवाइस घूर्णन, केवल रूट दृश्य यह विधि कहा जाता है हो जाता है।

आश्चर्य, में से किसी एक - willAnimate * तरीकों कॉल केवल रूट दृश्य के लिए भेजा जाता है, तो, परिभाषित करने subviews में इनमें से किसी भी व्यर्थ है।

इन तरीकों कहा जाता है हर उन्मुखीकरण एक ओरिएंटेशन द्वारा स्वीकार करने के लिए बदल जाता है - shouldAutorotateToInterfaceOrientation: विधि। इसलिए मैं मैं वहाँ से मेरी subviews 'फ्रेम संपत्ति chnage सकता लगा।

इसे पूरा करने के मैं अपने rootViewController कक्षा में निम्न विधि परिभाषित:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

मैं समझता हूँ कि नहीं क्यों फ्रेम संपत्ति अपडेट नहीं किया गया है, लेकिन मैं इस समाधान का काम करता है।

उम्मीद है की यह मदद करेगा....

25/03/2010 को 05:20
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more