iPhone देखने के लिए गोलीबारी नहीं


116

मैं साथ समस्या हो रही लोगों के बारे में कई पदों पढ़ा है viewWillAppear, जब आप अपने दृश्य पदानुक्रम का निर्माण नहीं करतीं सिर्फ सही। मेरी समस्या यह है कि मैं इसका मतलब नहीं समझ सकता।

यदि मैं एक नियंत्रक बनाता हूं RootViewControllerऔर addSubViewउस नियंत्रक को कॉल करता हूं, तो मुझे उम्मीद है कि जोड़े गए दृश्य ( viewWillAppearइवेंट्स ) को घटनाओं के लिए तार-तार कर दिया जाएगा ।

क्या किसी के पास एक जटिल प्रोग्रामेटिक दृश्य पदानुक्रम का उदाहरण है जो सफलतापूर्वक viewWillAppearहर स्तर पर घटनाओं को प्राप्त करता है?

Apple की डॉक्स स्थिति:

चेतावनी: यदि किसी दृश्य नियंत्रक से संबंधित दृश्य को सीधे पदानुक्रम में जोड़ दिया जाता है, तो दृश्य नियंत्रक को यह संदेश प्राप्त नहीं होगा। यदि आप दृश्य पदानुक्रम में कोई दृश्य सम्मिलित करते हैं या जोड़ते हैं, और इसमें एक दृश्य नियंत्रक है, तो आपको संबंधित संदेश नियंत्रक को सीधे यह संदेश भेजना चाहिए। दृश्य नियंत्रक भेजने में विफल यह संदेश किसी भी संबंधित एनीमेशन को प्रदर्शित होने से रोकेगा।

समस्या यह है कि वे इसका वर्णन नहीं करते कि यह कैसे करना है। "सीधे" का क्या अर्थ है? आप "अप्रत्यक्ष रूप से" एक दृश्य कैसे जोड़ते हैं?

मैं कोको और आईफोन के लिए काफी नया हूं, इसलिए अच्छा होगा अगर ऐप्पल की ओर से उपयोगी उदाहरण के अलावा बुनियादी हैलो वर्ल्ड बकवास भी हो।


मुझे यह समस्या तब तक हुई जब तक मुझे एहसास नहीं हुआ कि मैं आमतौर पर UIViewController उपवर्गों के उपयोग को गलत समझ रहा था। इस प्रश्न की जाँच करें। stackoverflow.com/questions/5691226/…
averydev

7
कृपया सावधान रहें !!! IOS 5 पर अब सच नहीं है !!! कॉल व्यू व्यूप्लेयर और व्यूडीड एपियर स्वतः
विलम कुर्ज़

जवाबों:


55

यदि आप एक नेविगेशन कंट्रोलर का उपयोग करते हैं और उसके प्रतिनिधि को सेट करते हैं, तो दृश्य {विल, डिड्यू} {अपीयर, डिसएपियर} विधियों को आमंत्रित नहीं किया जाता है।

आपको इसके बजाय नेविगेशन नियंत्रक प्रतिनिधि विधियों का उपयोग करने की आवश्यकता है:

navigationController:willShowViewController:animated:
navigationController:didShowViewController:animated:

2
मैंने अपने नेविगेशन कंट्रोलर के प्रतिनिधि को सेट नहीं किया था और अभी भी इस विधि को नहीं बुलाया जा रहा है। वैसे भी, मैंने इसे सेट किया और फिर मैंने आपके द्वारा ऊपर बताए गए तरीकों का इस्तेमाल किया। धन्यवाद।
दिमित्रिस


7
मैं सिर्फ iOS4 और iOS5 में यह परीक्षण किया: यह सच नहीं है: एक navigationController के प्रतिनिधि की स्थापना और फिर इसे करने की दृष्टि धक्का सक्रिय कर देगा viewWillAppear: आदि
DaGaMs

स्विफ्ट 3: समारोह navigationController (_ navigationController: UINavigationController, willShow ViewController: UIViewController, एनिमेटेड: बूल) {} और navigationController समारोह (_ navigationController: UINavigationController, didShow ViewController: UIViewController, एनिमेटेड: बूल) {}
Naloiko यूजीन

28

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

[myViewController viewWillAppear:NO];

Metronome उदाहरण में RootViewController.m को देखें।

(मैं वास्तव में Apple के उदाहरण परियोजनाओं को बहुत अच्छा लगा। हैलोवर्ल्ड की तुलना में बहुत अधिक है;)


3
वास्तव में, आपको सबव्यू में जोड़ने के बाद आपको viewWillAppear को कॉल करना चाहिए। अन्यथा, IBOutlets / IBActions को वायर्ड नहीं किया जाएगा।
4thस्पेस

2
हां, बाद में। XIB से बनाया गया सबव्यू, viewWillAppear नहीं कहा गया था। इसे अपने आप से बुलाओ और सब कुछ ठीक काम करता है।
जोम

धन्यवाद! मेरे लिए बिल्कुल यही था। मैं मैन्युअल रूप से एक सबव्यू जोड़ रहा था [scrollView addSubview:controller.view];। मैंने [controller viewWillAppear:NO];बाद में लाइन लगाई और वोइला! एक जादू की तरह काम किया।
रोब एस

सभी संभावना में, इसका कारण यह है कि आपका UIViewController एक दृश्य को नियंत्रित कर रहा है जो किसी अन्य UIViewController द्वारा नियंत्रित दृश्य का एक उप-भाग है। यह इच्छित डिज़ाइन पैटर्न नहीं है। अधिक स्पष्टीकरण के लिए इस पोस्ट को देखें। stackoverflow.com/questions/5691226/…
averydev

6
कृपया सावधान रहें !!! IOS 5 पर अब सच नहीं है !!! अपने आप को देखें और स्वचालित रूप से देखें। यदि आप इसे मैन्युअल रूप से कहते हैं, तो इसे दो बार कहा जाएगा।
विल्म कुर्ज़

18

मैं अंत में इस काम के लिए एक समाधान मिल गया!

UINavigationControllerDelegate

मुझे लगता है कि इसका सार यह है कि यह आपके नियंत्रण को देखने के लिए अपने नौसेना नियंत्रण के प्रतिनिधि को सेट करना है UINavigationControllerDelegateऔर इसे लागू करना है और यह दो तरीके हैं। प्रतिभाशाली! मैं बहुत उत्साहित हूँ मैं अंत में एक समाधान मिला!


कैसे नेविगेशन रूट के लिए प्रतिनिधि के रूप में एक rootviewcontroller असाइन करने के लिए?
गार्गो

1
यह काम नहीं करता है! एप्लिकेशन को कम से कम करने और इसे अधिकतम करने की कोशिश करें
व्याचेस्लाव गेर्चिकोव

8

मेरा बस यही मुद्दा था। मेरे आवेदन में मेरे पास 2 नेविगेशन नियंत्रक हैं और उनमें से प्रत्येक में एक ही दृश्य नियंत्रक को धक्का देना एक मामले में काम करता है और दूसरे में नहीं। मेरा मतलब है कि जब पहली बार में एक ही दृश्य नियंत्रक को धक्का दिया जाता है UINavigationController, तो viewWillAppearउसे बुलाया जाता है, लेकिन दूसरे नेविगेशन नियंत्रक में धकेलने पर नहीं।

तब मैं इस पोस्ट पर आया था UINavigationController को viewWillAppear / viewWillDisappear तरीकों को कॉल करना चाहिए

और महसूस किया कि मेरे दूसरे नेविगेशन नियंत्रक ने फिर से परिभाषित किया viewWillAppear। कोड की स्क्रीनिंग से पता चला कि मैं फोन नहीं कर रहा था

[super viewWillAppear:animated];

मैंने इसे जोड़ा और यह काम किया!

प्रलेखन कहता है:

यदि आप इस विधि को ओवरराइड करते हैं, तो आपको अपने कार्यान्वयन में कुछ बिंदु पर सुपर को कॉल करना होगा।


इधर भी ऐसा ही है। सुपर न कहकर गड़बड़ कर दी।
ओलिवारेसएफ

5

मैं एक नेविगेशन नियंत्रक का उपयोग कर रहा हूं। जब मैं या तो डेटा के दूसरे स्तर पर उतरना चाहता हूं या अपना कस्टम दृश्य दिखाना चाहता हूं तो मैं निम्नलिखित का उपयोग करता हूं:

[self.navigationController pushViewController:<view> animated:<BOOL>];

जब मैं ऐसा करता हूं, तो मुझे viewWillAppearसमारोह में आग लग जाती है। मुझे लगता है कि यह "अप्रत्यक्ष" के रूप में अर्हता प्राप्त करता है क्योंकि मैं वास्तविक addSubViewपद्धति को खुद नहीं कह रहा हूं। मुझे नहीं पता कि यह 100% आपके आवेदन पर लागू होता है क्योंकि मैं नहीं बता सकता कि क्या आप नेविगेशन नियंत्रक का उपयोग कर रहे हैं, लेकिन शायद यह एक सुराग प्रदान करेगा।


5

धन्यवाद iOS 13

ViewWillDisappear, और iOS 13 पर एक प्रेजेंटिंग व्यू कंट्रोलर पर कॉल नहीं किया जाएगा ViewDidDisappear, जो एक नई मोडल प्रस्तुति का उपयोग करता है जो पूरी स्क्रीन को कवर नहीं करता है।ViewWillAppearViewDidAppear

क्रेडिट्स होल्को होल्को जा रहे हैं । उसने सचमुच मेरा दिन बचा लिया।

यहां छवि विवरण दर्ज करें


4

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

दूसरे, आप मैन्युअल रूप से सूचनाओं को अग्रेषित करने के लिए उपयोग / कर सकते हैं , लेकिन मैंने पाया कि संपूर्ण पदानुक्रम को सही ढंग से काम करने के लिए कॉल करने के लिए, मुझे केवल मैन्युअल रूप से कॉल करना थाUITabBarDelegateUINavigationBarDelegate

[tabBarController viewWillAppear:NO];
[tabBarController viewDidAppear:NO];

तथा

[navBarController viewWillAppear:NO];
[navBarController viewDidAppear:NO];

.. संबंधित नियंत्रक पर दृश्य नियंत्रक स्थापित करने से ठीक पहले ONCE (आवंटन के ठीक बाद)। तब से, यह इन तरीकों को अपने बच्चे के दृष्टिकोण नियंत्रकों पर सही ढंग से कहता है।

मेरी पदानुक्रम इस तरह है:

window
    UITabBarController (subclass of)
        UIViewController (subclass of) // <-- manually calls [navController viewWill/DidAppear
            UINavigationController (subclass of)
                UIViewController (subclass of) // <-- still receives viewWill/Did..etc all the way down from a tab switch at the top of the chain without needing to use ANY delegate methods

बस टैब / नेवी कंट्रोलर पर उल्लिखित विधियों को कॉल करके पहली बार सुनिश्चित किया गया कि सभी घटनाओं को सही ढंग से आगे बढ़ाया गया था। इसने मुझे UINavigationBarDelegate/ UITabBarControllerDelegateविधियों से मैन्युअल रूप से कॉल करने की आवश्यकता रोक दी ।

सिडेनोट: उत्सुकता से, जब यह काम नहीं किया, तो निजी पद्धति

- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController 

.. जिसे आप कॉलस्टैक से एक कार्यशील कार्यान्वयन पर देख सकते हैं, आमतौर पर viewWill/Did..तरीकों को कॉल करते हैं, लेकिन जब तक मैंने ऊपर प्रदर्शन नहीं किया था (भले ही इसे कहा जाता था)।

मुझे लगता है कि यह बहुत महत्वपूर्ण है कि UITabBarControllerहालांकि खिड़की के स्तर पर है और दस्तावेज इसे वापस करने लगते हैं।

आशा है कि स्पष्ट (ईश) था, आगे के सवालों के जवाब देने के लिए खुश।


3

जैसा कि कोई उत्तर स्वीकार नहीं किया जाता है और लोग (जैसे मैंने किया था) यहां भूमि मैं अपनी भिन्नता देता हूं। हालांकि मुझे यकीन नहीं है कि यह मूल समस्या थी। जब नेविगेशन कंट्रोलर को एक अन्य दृश्य में सबव्यू के रूप में जोड़ा जाता है, तो आपको viewWillAppear / Dissappear आदि को कॉल करना होगा।

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

    [subNavCntlr viewWillAppear:animated];
}

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

    [subNavCntlr viewWillDisappear:animated];
}

सिर्फ उदाहरण को पूरा करने के लिए। यह कोड मेरे ViewController में दिखाई देता है जहां मैंने बनाया और नेविगेशन नियंत्रक को एक दृश्य में जोड़ा गया जिसे मैंने दृश्य पर रखा था।

- (void)viewDidLoad {

    // This is the root View Controller
    rootTable *rootTableController = [[rootTable alloc]
                 initWithStyle:UITableViewStyleGrouped];

    subNavCntlr = [[UINavigationController alloc]   
                  initWithRootViewController:rootTableController];

    [rootTableController release];

    subNavCntlr.view.frame = subNavContainer.bounds;

    [subNavContainer addSubview:subNavCntlr.view];

    [super viewDidLoad];
}

.हम ऐसा लगता है

@interface navTestViewController : UIViewController <UINavigationControllerDelegate> {
    IBOutlet UIView *subNavContainer;
    UINavigationController *subNavCntlr;
}

@end

निब फ़ाइल में मेरे पास दृश्य है और इस दृश्य के नीचे मेरे पास एक छवि और कंटेनर (एक और दृश्य) है जहां मैं नियंत्रक में हूं। यहां बताया गया है कि यह कैसा दिखता है। मुझे कुछ चीजें खंगालनी पड़ीं क्योंकि यह एक क्लाइंट के लिए काम था।

वैकल्पिक शब्द


3

दृश्यों को "सीधे" कॉल करके जोड़ा जाता है [view addSubview:subview]। टैब बार या नेवी बार जैसे सबव्यू को स्वैप करने वाले तरीकों से दृश्यों को "इनडायरेक्टली" जोड़ा जाता है।

जब भी आप कॉल करते हैं [view addSubview:subviewController.view], तब आपको कॉल करना चाहिए [subviewController viewWillAppear:NO](या यस जैसा कि आपका मामला हो सकता है)।

मुझे यह समस्या तब हुई जब मैंने एक गेम में सबस्क्रीन के लिए अपना कस्टम रूट-व्यू मैनेजमेंट सिस्टम लागू किया। ManWillAppear को देखने के लिए कॉल को मैन्युअल रूप से जोड़ने से मेरी समस्या ठीक हो गई।


3

इसे करने का सही तरीका है UIViewController Contition api।

- (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     UIViewController *viewController = ...;
     [self addChildViewController:viewController];
     [self.view addSubview:viewController.view];
     [viewController didMoveToParentViewController:self];
}

यह बिल्कुल सही आधुनिक समाधान (iOS 9,8,7) है। इसके अलावा, यदि आप मक्खी पर एम्बेडेड दृश्य नियंत्रक बदल रहे हैं, तो आपको कॉल करना होगा [viewController willMoveToParentViewController: nil]; [viewController.view removeFromSuperview]; [viewController removeFromParentViewController];
एली बर्क

1
इस मामले में viewWillAppear:अभी भी नहीं बुलाया जा सकता है
व्याचेस्लाव गेर्चिकोव

2

मैं पुश और पॉप व्यू कंट्रोलर के लिए इस कोड का उपयोग करता हूं:

धक्का दें:

[self.navigationController pushViewController:detaiViewController animated:YES];
[detailNewsViewController viewWillAppear:YES];

पॉप:

[[self.navigationController popViewControllerAnimated:YES] viewWillAppear:YES];

.. और यह मेरे लिए ठीक काम करता है।


2

एक बहुत ही सामान्य गलती इस प्रकार है। आपके पास एक दृश्य है UIView* a, और दूसरा एक UIView* b,। आप एक सबव्यू के रूप में बी को जोड़ते हैं। यदि आप b में viewWillAppear को कॉल करने का प्रयास करते हैं, तो इसे कभी भी निकाल नहीं दिया जाएगा, क्योंकि यह एक का एक सबव्यू है


2

यहाँ बट में iOS 13 बिट मेरा ऐप। यदि आपने आईओएस 13 के रूप में व्यवहार में बदलाव देखा है, तो उसे धक्का देने से पहले बस निम्नलिखित सेट करें:

yourVC.modalPresentationStyle = UIModalPresentationFullScreen;

आपको इसे अपने .storyboard में एट्रीब्यूट्स इंस्पेक्टर (सेट प्रेजेंटेशन टू फुल स्क्रीन) में भी सेट करना पड़ सकता है।

यह आपके ऐप को वैसा ही व्यवहार करेगा जैसा उसने iOS के पूर्व संस्करणों में किया था।


1

मुझे इस पर 100% यकीन नहीं है, लेकिन मुझे लगता है कि व्यू पदानुक्रम के लिए एक दृश्य को जोड़ने का सीधा मतलब -addSubview:है कि दृश्य नियंत्रक के दृश्य (जैसे [viewController.view addSubview:anotherViewController.view]) पर कॉल करने के बजाय नेविगेशन नियंत्रक के स्टैक पर एक नया दृश्य नियंत्रक को धक्का देना।


1

मुझे लगता है कि एक सबव्यू जोड़ने का मतलब यह नहीं है कि दृश्य दिखाई देगा, इसलिए क्लास की विधि के लिए एक स्वचालित कॉल नहीं है जो यह होगा


1

मुझे लगता है कि उनका मतलब है "सीधे" चीजों को झुकाकर उसी तरह से है जैसे कि एक्सकोड "नेविगेशन एप्लिकेशन" टेम्पलेट करता है, जो यूनीवेशनकंट्रोलर को एप्लिकेशन के UIWindow के एकमात्र उप-भाग के रूप में सेट करता है।

उस टेम्पलेट का उपयोग करना एक ही तरीका है जिससे मैं UINavigationController में उन नियंत्रकों के पुश / पॉप पर ऑब्जेक्ट ViewControllers पर कॉल विल / डिड / अपीयर / अपीयर / प्राप्त कर सकता हूं। मेरे द्वारा काम किए गए उत्तरों में से कोई भी समाधान मेरे लिए काम नहीं करता है, जिसमें उन्हें रूटकंट्रोलर में लागू करना और उन्हें (बच्चे) नेवीगेशनकंट्रोलर के माध्यम से पारित करना शामिल है। उन कार्यों ((/ किया / प्रकट / गायब) को केवल मेरे रूटकंट्रोलर में शीर्ष-स्तर के कुलपतियों, मेरे "लॉगिन" और नेविगेशनवीवी को छिपाने, नेविगेशन नियंत्रक में उप-कुलियों को नहीं दिखाने पर बुलाया गया था, इसलिए मेरे पास कोई अवसर नहीं था नव कुलपति को "उनके माध्यम से पारित"।

मैंने अपने ऐप में फॉलो-अप कार्यक्षमता की आवश्यकता वाले विशेष बदलावों को देखने के लिए UINavigationController के प्रतिनिधि कार्यक्षमता का उपयोग करके समाप्त किया, और यह काम करता है, लेकिन इसे गायब होने और कार्यक्षमता "सिम्युलेटेड" दोनों प्राप्त करने के लिए थोड़ा और काम करने की आवश्यकता है।

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


1

मामले में यह किसी की मदद करता है। मुझे इसी तरह की समस्या थी, जहां पर मैं ViewWillAppearफायरिंग नहीं कर रहा हूं UITableViewController। चारों ओर बहुत खेलने के बाद, मुझे एहसास हुआ कि समस्या यह थी कि जो UINavigationControllerमुझे नियंत्रित कर रहा UITableViewहै वह मूल दृष्टिकोण पर नहीं है। एक बार मैंने इसे ठीक कर लिया, यह अब एक विजेता की तरह काम कर रहा है।


क्या आप कृपया "कैसे" आप ऐसा कर सकते हैं?
Brabbeldas

1

मुझे सिर्फ यह समस्या थी और इसे ठीक करने में मुझे पूरे 3 घंटे (जिनमें से 2 googling) लगे।

मदद करने के लिए जो निकला वह केवल डिवाइस / सिम्युलेटर से ऐप को हटाने, साफ करने और फिर से चलाने के लिए था

उम्मीद है की वो मदद करदे


1
[self.navigationController setDelegate:self];

प्रतिनिधि को रूट व्यू कंट्रोलर पर सेट करें।


1

स्विफ्ट के लिए। पहले देखने के लिए जो आप कॉल करना चाहते थे उसे बनाने के लिए प्रोटोकॉल बनाएँ ।WillAppear

protocol MyViewWillAppearProtocol{func myViewWillAppear()}

दूसरा, क्लास बनाएं

class ForceUpdateOnViewAppear: NSObject, UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool){
    if let updatedCntllr: MyViewWillAppearProtocol = viewController as? MyViewWillAppearProtocol{
        updatedCntllr.myViewWillAppear()
    }
}

}

तीसरा, ForceUpdateOnViewAppear का उदाहरण उपयुक्त वर्ग का सदस्य बनाना है जिसके पास नेविगेशन नियंत्रक तक पहुंच है और तब तक मौजूद है जब तक नेविगेशन नियंत्रक मौजूद है। यह उदाहरण के लिए हो सकता है कि नेविगेशन नियंत्रक या इसे बनाने या प्रस्तुत करने वाले वर्ग का रूट व्यू कंट्रोलर हो। फिर ForceUpdateOnViewAppear के उदाहरण को जल्द से जल्द नेविगेशन कंट्रोलर के प्रतिनिधि संपत्ति में असाइन करें।


0

मेरे मामले में समस्या कस्टम संक्रमण एनीमेशन के साथ थी। जब सेट modalPresentationStyle = .custom viewWillAppearनहीं कहा जाता है

कस्टम संक्रमण एनीमेशन वर्ग में कॉल विधियों की आवश्यकता है: beginAppearanceTransitionऔरendAppearanceTransition


0

मेरे मामले में जो ios 12.1 एमुलेटर पर सिर्फ एक अजीब बग था। असली डिवाइस पर लॉन्च करने के बाद गायब हो गया।


0

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

यहाँ GIST कोड दिखा रहा है


0

ViewWillAppear, UIViewController क्लास का एक ओवरराइड तरीका है, इसलिए एक सब-व्यू को जोड़ने के लिए कॉल नहीं किया जाएगा, लेकिन जब आप उपस्थित होते हैं, तो पुश, पॉप, शो, सेटऑउट या एक व्यू कॉन्ट्रोलर से popToRootViewController, तब व्यू व्यू कंट्रोलर को प्रस्तुत किया जाएगा।


0

मेरा मुद्दा यह था कि जब किसी सहकर्मी से विचार-विमर्श किया जाता है तो viewWillAppear को नहीं बुलाया गया था। जवाब देखने के लिए एक कॉल डाल दिया गया था (देखें) सच देखें कि आप जिस सीनियर में वापस आ रहे हैं, उस सेगमेंट में बहस करें

@IBAction func खोलना (खोलना के लिए: UStoryboardSegue, ViewController के बाद एलडीवी) किसी भी {

   viewWillAppear(true)
}

-2

मुझे यकीन नहीं है कि यह वही समस्या है जिसे मैंने हल किया है।
कुछ अवसरों में, विधि सामान्य तरीके से निष्पादित नहीं होती है जैसे कि "[सेल्फ मेथोडेन]"।

प्रयत्न

- (void)viewWillAppear:(BOOL)animated
{
    [self performSelector:@selector(methodOne) 
           withObject:nil afterDelay:0];
}

समस्या को viewWillAppearबुलाया नहीं जाता है
व्याचेस्लाव गेरिकोकोव

-3

आपके पास कभी भी 1 UIViewController सक्रिय होना चाहिए। आपके द्वारा हेरफेर करने के लिए कोई भी साक्षात्कार बिल्कुल वही होना चाहिए - सबविड्स - यानी उविवि।

मैं अपने दृश्य पदानुक्रम के प्रबंधन के लिए एक simlple तकनीक का उपयोग करता हूं और अभी तक एक समस्या में नहीं चला गया हूं क्योंकि मैंने इस तरह से चीजें करना शुरू कर दिया है। 2 मुख्य बिंदु हैं:

  • एक एकल UIViewController को आपके ऐप के "एक स्क्रीन के मूल्य" का प्रबंधन करने के लिए उपयोग किया जाना चाहिए
  • विचारों को बदलने के लिए UINavigationController का उपयोग करें

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

UINavigationController के लिए के रूप में - यह तुम्हारा सबसे अच्छा दोस्त है! नेविगेशन बार बंद करें और एनिमेटेड के लिए NO निर्दिष्ट करें, और आपके पास मांग पर स्क्रीन स्विच करने का एक शानदार तरीका है। यदि आप पदानुक्रम में हैं, तो आप नियंत्रकों को पुश और पॉप कर सकते हैं, या आप व्यू कंट्रोलर्स की एक सरणी (एकल वीसी युक्त एक सरणी सहित) तैयार कर सकते हैं और इसे सेटव्यूकंट्रोलर्स का उपयोग करके व्यू स्टैक के रूप में सेट कर सकते हैं। यह आपको कुलपति को बदलने की पूरी स्वतंत्रता देता है, जबकि ऐप्पल के अपेक्षित मॉडल के भीतर काम करने के सभी फायदे प्राप्त करने और सभी घटनाओं आदि को ठीक से निकाल दिया जाता है।

जब मैं एक ऐप शुरू करता हूं तो हर बार यहां क्या करता हूं:

  • एक विंडो-आधारित ऐप से शुरू करें
  • विंडो के rootViewController के रूप में एक UINavigationController जोड़ें
  • जो कुछ भी मैं अपने पहले UIViewController को जोड़ना चाहता हूं उसे नौसेना नियंत्रक के rootViewController के रूप में होना चाहिए

(विंडो-बेस्ड से शुरू होने वाला नोट सिर्फ एक निजी प्राथमिकता है - मुझे खुद चीजों का निर्माण करना पसंद है इसलिए मुझे पता है कि वे कैसे बनाए जाते हैं। यह व्यू-आधारित टेम्पलेट के साथ ठीक काम करना चाहिए)

सभी घटनाओं में आग सही ढंग से और मूल रूप से जीवन अच्छा है। फिर आप अपना सारा समय अपने ऐप के महत्वपूर्ण बिट्स को लिखने में बिता सकते हैं और आकार में पदानुक्रमों को मैन्युअल रूप से हैक करने की कोशिश करने के बारे में गड़बड़ नहीं कर सकते हैं।


कई दृश्य नियंत्रकों के सक्रिय होने में कुछ भी गलत नहीं है; UIViewController के पास पदानुक्रम का निर्माण करने की अनुमति देने के तरीके हैं (उदाहरण [addChildViewController:])।
रिचर्ड

1
हाँ अब करता है। 2011 में यह नहीं हुआ। जवाब उस समय सटीक था, माना जाता है कि यह अब नहीं है।
निगेल फ्लैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.