2009-06-16 7 views
10

पर स्टैक से व्यू कंट्रोलर पॉप अप करने के बाद स्वचालित रूप से एक विधि को कैसे कॉल करें, नेविगेशन स्टैक से बच्चे को देखने के बाद मुझे आईफोन पर मूल दृश्य अपडेट करने की आवश्यकता है। जब बच्चे को ढेर से पॉप किया जाता है और माता-पिता फिर से दिखाई देते हैं तो मैं माता-पिता दृश्य को अधिसूचित या स्वचालित विधि कॉल प्राप्त करने के लिए कैसे सेट कर सकता हूं?आईफोन

उपयोगकर्ता उस बच्चे के पृष्ठ पर डेटा दर्ज करता है जिसे मैं उपयोगकर्ता के पूरा होने के बाद मूल पृष्ठ पर प्रदर्शित करना चाहता हूं और दृश्य को पॉप करता हूं।

आपकी मदद के लिए धन्यवाद!

उत्तर

13

मैंने अभी इस समस्या को हल किया है - और ऊपर दिए गए उत्तर लगभग सही हैं, वे सिर्फ प्रतिनिधि को स्थापित करने के बारे में भूल गए हैं।

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

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil]; 
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv]; 
[nc setDelegate:sv]; 
: -

जब मैं (नीचे SettingsView) मेरे माता-पिता दृश्य बनाते हैं, और एक UINavigationController रूट दृश्य के रूप में जोड़ने, मैं इससे पहले कि मैं दृश्य प्रदर्शित UINavigationController के प्रतिनिधि सेट करने के लिए सुनिश्चित करें कि महत्वपूर्ण हिस्सा है

माता-पिता को देखते हुए, UINavigationControllerDelegate प्रोटोकॉल लागू:

@interface SettingsView : UIViewController <UINavigationControllerDelegate> 

और willShowViewController तरीका प्रदान:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    // Your code to update the parent view 
} 

इसे बच्चे के दृश्य को खारिज करने के बाद कहा जाता है, और माता-पिता दृश्य को फिर से चलाने से पहले।

+0

वाह धन्यवाद, वही समस्या थी। – drew010

+0

सही उत्तर स्वीकार करने के लिए मत भूलना। –

+0

आपका अवलोकन बहुत महत्वपूर्ण था .... unforgiven3 उत्तर सही है, लेकिन यदि आप ViewController में UINavigationControllerDelegate प्रोटोकॉल को लागू नहीं करते हैं, जहां आप कॉलिंग करेंगेवव कंट्रोलर यह कभी काम नहीं करेगा, और माता-पिता ViewController भी आपको "ViewController __strong" भेजने की शिकायत करेगा असंगत प्रकार आईडी का पैरामीटर –

6

मुझे इस तरह कुछ करने की आवश्यकता थी। ViewController कि मेरे UINavigationController स्वामित्व में, मैं willShowViewController लागू करने के लिए, इस तरह था:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
} 

विधि कहा जाता है यही कारण है कि जब भी UINavigationController विचारों बदल जाता है। अगर मैं आपके प्रश्न को सही तरीके से समझ रहा हूं, तो मुझे लगता है कि यह वही करना चाहिए जो आप चाहते हैं।

3

मुझे लगता है कि यहां कुछ भ्रम है। UIView एस को UINavigationController के ढेर से धक्का नहीं दिया गया है और पॉप किया गया है। धक्का दिया जा रहा है और पॉप किया गया है UIViewControllers, जो बदले में एक या (अधिक बार) कई विचारों को संभालता है।

सौभाग्य से, UIViewController इन तरीकों है:

-(void) viewWillAppear:(BOOL)animated; 
-(void) viewDidAppear:(BOOL)animated; 
-(void) viewWillDisappear:(BOOL)animated; 
-(void) viewDidDisappear:(BOOL)animated; 

ये जब भी देखने के लिए के बारे में है कहा जाता है (जिले) दिखाई देते हैं, या बस (dis) है दिखाई दिया। मैं टैब बार, मोडल दृश्य और नेविगेशन नियंत्रकों के साथ काम करता हूं। (और यह आपके द्वारा कस्टम नियंत्रकों को लागू इन का उपयोग करना एक अच्छा विचार है।)

अपने मामले में

तो, अगर मैं सही ढंग से समझ, तो आप बस viewWillAppear ओवरराइड करने के लिए है: या viewDidAppear: आप क्या कहते हैं पर विधि " अभिभावक पृष्ठ "(जिसे संभावित रूप से UIViewController द्वारा संभाला जाता है) और डेटा दर्ज किए गए डेटा को प्रतिबिंबित करने के लिए पृष्ठ की उपस्थिति को अपडेट करने के लिए कोड में डाल दिया गया है।

(अगर मैं सही ढंग से याद है, तो आप यह सुनिश्चित करें कि UINavigationController, एक viewWill/DidAppear: संदेश जब वह पहली बार प्रदर्शित किया जाता है हो जाता है क्रम में करने के लिए इन संदेशों को बाद में अपने बच्चे के नियंत्रकों के लिए भेजा जाना सुनिश्चित करना चाहिए। यदि आप एक टेम्पलेट के साथ सेट अप किया है या आईबी में आपको शायद इसके बारे में चिंता करने की ज़रूरत नहीं है।)

0

यदि आपको एक नियंत्रक को दूसरे को सूचित करने की आवश्यकता है तो आप here (see 2nd answer) वर्णित प्रतिनिधिमंडल पैटर्न का उपयोग कर सकते हैं।

दुर्भाग्य से आपके द्वारा वर्णित सटीक कार्य के लिए कोई स्वचालित अधिसूचना (AFAIK) नहीं है। अपनी जरूरतों को पूरा करने के लिए आप अपने बच्चे नियंत्रक के व्यू विल्ल डिस्प्लेयर फ़ंक्शन में प्रतिनिधि (यानी अपने मूल नियंत्रक को) संदेश भेज सकते हैं।

+1

जो आपके बच्चे के नियंत्रक के बच्चे होने पर बोझिल है। उस मामले में 'व्यूविल डिस्प्लेयर' कहा जाता है जब बच्चा पोते को दबाता है और साथ ही जब बच्चा पॉप हो जाता है। केवल बाद के मामले में आप माता-पिता को संदेश भेजना चाहते हैं। मुझे अभी तक उस मुद्दे से एक शानदार तरीका नहीं मिला है। –

2

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

एक ही समय में सुपर विधि को कॉल करना सुनिश्चित करें। उचित कार्यान्वयन इस तरह दिखेगा:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSLog(@"View Appearing"); 
}