2009-07-30 12 views
5

यदि मैं पहले से कॉन्फ़िगर नहीं किया गया है, तो मैं पासवर्ड के लिए उपयोगकर्ताओं से पूछने के लिए स्टार्टअप पर एक मोडल UITableView का उपयोग करना चाहता हूं। हालांकि, uitableview को कॉल करने का आदेश ViewDidLoad के अंदर काम नहीं कर रहा है।प्रस्तुति पर मॉडेल व्यू कंट्रोलर काम कर सकते हैं?

स्टार्टअप कोड:

- (void)viewDidLoad { 
    rootViewController = [[SettingsController alloc] 
    initWithStyle:UITableViewStyleGrouped]; 
    navigationController = [[UINavigationController alloc]  
    initWithRootViewController:rootViewController]; 

    // place where code doesn't work 
    //[self presentModalViewController:navigationController animated:YES]; 
} 

हालांकि, एक ही कोड ठीक काम करता है जब बाद में एक बटन से बुलाया:

- (IBAction)settingsPressed:(id)sender{ 
    [self presentModalViewController:navigationController animated:YES]; 
} 

संबंधित प्रश्न: मैं कैसे (ऊपरी स्तर पर) भावना है जब UITableView ने छोड़ने के लिए कमांड का उपयोग किया है?

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

उत्तर

7

आप कोड में कहीं presentModalViewController:animated: कॉल कर सकते हैं - यह दृश्य नियंत्रक के viewWillAppear विधि में काम करना चाहिए, या एप्लिकेशन प्रतिनिधि में applicationDidFinishLaunching विधि में (यह वह जगह है जहाँ मैं अपने ऑन-लांच मोडल नियंत्रकों जगह)।

यह देखने के लिए कि जब दृश्य नियंत्रक गायब हो जाता है, तो आप पेरेंट व्यू कंट्रोलर पर एक विधि परिभाषित कर सकते हैं और विधि को कॉल करने के लिए बच्चे नियंत्रक पर dismissModalViewControllerAnimated के कार्यान्वयन को ओवरराइड कर सकते हैं। इस तरह कुछ:

// Parent view controller, of class ParentController 
- (void)modalViewControllerWasDismissed { 
    NSLog(@"dismissed!"); 
} 

// Modal (child) view controller 
- (void)dismissModalViewControllerAnimated:(BOOL)animated { 
    ParentController *parent = (ParentController *)(self.parentViewController); 
    [parent modalViewControllerWasDismissed]; 

    [super dismissModalViewControllerAnimated:animated]; 
}
+0

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

+0

इसे 'applicationDidFinishLaunching' से कॉल नहीं कर सकता - यह प्रतिनिधि से संबंधित एक तरीका है, जो व्यू कंट्रोलर नहीं है। आपको रूट व्यू कंट्रोलर ऑब्जेक्ट की आवश्यकता है। अक्सर यह आपके लिए एक्सकोड द्वारा स्वचालित रूप से बनाया गया है; अपने ऐप प्रकार के आधार पर 'व्यू कंट्रोलर', 'रूट कंट्रोलर' या 'टैबबार नियंत्रक' नामक संश्लेषित संपत्ति की तलाश करें। – Tim

+1

यह अस्पष्ट हो सकता है (क्षमा करें!); मेरा मतलब था 'applicationDidFinishLaunching' में आप' [self present ...] 'नहीं चला सकते हैं - इसके बजाय आपको अपने व्यू कंट्रोलर के नाम के आधार पर '[self.viewController present ...]' या इसी तरह चलाने के लिए है वस्तु। – Tim

0

आपको लगता है कि जैसे कि यह क्या करने जा रहे हैं तो आप, अपने स्वयं के प्रोटोकॉल की घोषणा करने के बताने के लिए जब UITableView parentViewController को खारिज कर दिया सक्षम होना चाहिए करने के लिए जा रहे हैं ताकि आप एक प्रोटोकॉल

की तरह एक विधि है कि घोषित
-(void)MyTableViewDidDismiss 

तो अपने माता पिता के वर्ग में आप इस प्रोटोकॉल को लागू कर सकते हैं और आप tableView में dismissModalView के बाद आप प्रतिनिधि पर MyTableViewDidDismiss (whihc जनक दृश्य नियंत्रक है) कह सकते हैं।

6

मुझे एक ही समस्या थी। मैं जानता हूँ कि विषय पुराना है लेकिन शायद मेरी समाधान मदद कर सकता है किसी और ... तुम सिर्फ एक विधि में अपने मॉडल परिभाषा बढ़ना है:

// ModalViewController initialization 
- (void) presentStartUpModal 
{ 
    ModalStartupViewController *startUpModal = [[ModalStartupViewController alloc] initWithNibName:@"StartUpModalView" bundle:nil]; 
    startUpModal.delegate = self; 

    [self presentModalViewController:startUpModal animated:YES]; 
    [startUpModal release]; 
} 

इसके बाद, viewDidLoad, एक performSelector:withObject:afterDelay: में अपने मॉडल परिभाषा विधि कॉल देरी मूल्य के रूप में 0 के साथ। इस तरह:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //[self presentStartUpModal]; // <== This line don't seems to work but the next one is fine. 
    [self performSelector:@selector(presentStartUpModal) withObject:nil afterDelay:0.0]; 
} 

मुझे अभी भी समझ में नहीं आता कि 'मानक' तरीका क्यों काम नहीं करता है।

+0

इसे पोस्ट करने के लिए धन्यवाद। मैं इसे दिनों के लिए काम करने की कोशिश कर रहा हूं और इससे मेरी एक जैसी समस्या हल हो गई है। आप की तरह, मुझे नहीं पता कि पहला व्यक्ति क्यों काम नहीं करता है लेकिन दूसरा करता है - लेकिन फिर भी समस्या हल हो जाती है। – gnuchu

+0

धन्यवाद!यह बहुत अच्छा काम किया। –

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