2013-03-25 5 views
10

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

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

  1. स्टोरीबोर्ड
  2. पर AuthenticateViewController दृश्य बनाएं AuthenticateViewController के लिए कोड फ़ाइलें बनाएं, और उन्हें इसी दृश्य को असाइन
  3. बनाएँ:

    निम्नलिखित कदम सब कुछ मैं परियोजना बनाने के बाद से किया है UITabBarController subclass के लिए कोड फ़ाइलें, और प्रारंभिक UITabBarController दृश्य को उस नए सबक्लास

  4. से कनेक्ट करें UITabBarController दृश्य से स्टोरीबोर्ड पर एक नया सीगू Authenti में जोड़ें cateViewController दृश्य
  5. मैन्युअल UITabBarController उपवर्ग में viewDidLoad से segue फोन

जब मैं आवेदन मोडल segue आग नहीं करता है चलाने के लिए, UITabBarController के पहले ViewController दिखाया गया है, और मैं XCode में निम्नलिखित आउटपुट प्राप्त :

Warning: Attempt to present <AuthenticateViewController: 0x83c0c10> on <EPTabBarController: 0x83be600> whose view is not in the window hierarchy! 

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

EPTabBarController, UITabBarController के उपवर्ग:

#import "EPTabBarController.h" 
#import "AuthenticateViewController.h" 

@interface EPTabBarController() 

@end 

@implementation EPTabBarController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self performSegueWithIdentifier:@"authenticationSegue" sender:self]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

उत्तर

14

मुद्दा अंदर है

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  
    [self performSegueWithIdentifier:@"authenticationSegue" sender:self]; 
} 

जिस समय आपके वर्तमान दृश्य एक और (AuthenticateViewController) दृश्य पेश करने के लिए (EPTabBarController) कोशिश कर रहे हैं अभी तक में लोड नहीं है खिड़की पदानुक्रम।

तो पहले विंडो पदानुक्रम में लोड होने के लिए अपने EPTabBarController को दें और फिर AuthenticateViewController प्रस्तुत करें।

दें कि यह एक कोशिश

- (void)viewDidLoad 
{ 
    [super viewDidLoad];   
    [self performSelector:@selector(loadAuthenticateViewController) 
       withObject:nil 
       afterDelay:1.0]; 
} 

-(void)loadAuthenticateViewController 
{ 
    [self performSegueWithIdentifier:@"authenticationSegue" sender:self]; 
} 
+1

यह काम करता है, लेकिन मुझे एक अजीब समाधान के रूप में मारता है। क्या यह पूरा करने का यही एकमात्र तरीका है? क्या 'performSegueWithIdentifer:' कॉल कहीं और रखा जाना चाहिए? – blundin

+0

हे @ ब्लंडिन कृपया बाद में सेट करने का प्रयास करें: 0.0 और जांचें। अगर मुझे चिकनी काम करता है तो मुझे बताएं –

+1

हां, यह आसानी से काम करता है। धन्यवाद। – blundin

2

तुम सच में नियंत्रण में करना चाहते हैं, कुछ इस तरह का उपयोग करें:

@implementation UeInitialisationViewController 
BOOL didLoad; 
BOOL wantPush; 

- (id)init { 
    self = [super init]; 
    if (self) { didLoad = NO; wantPush = NO; } 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    didLoad = YES; 
    if (wantPush == YES) 
     [self performSelector:@selector(pushToMainView) 
        withObject:nil afterDelay:0.0001]; 
} 

- (void)pushToMainView { 
    if (didLoad == YES) 
     [self performSegueWithIdentifier:@"pushToMainView" sender:self]; 
    else 
     wantPush = YES; 
} 
@end 

यह Segue pushToMainView सक्रिय होगा जब आप संदेश [controller pushToMainView] लेकिन वापस रखती है, जब तक दृश्य लोड नहीं हो जाता है।

3

अपने कोड को केवल DidAppear में देखने के बारे में कैसे?

- (void)viewDidAppear 
{ 
    [super viewDidAppear];  
    [self performSegueWithIdentifier:@"authenticationSegue" sender:self]; 
} 

हालांकि, मैं अभी भी इन समाधानों से असंतुष्ट हूं क्योंकि मूल दृश्य अभी भी एक सेकंड के अंश के लिए दिखाई देता है।

मूल दृश्य को दिखाए बिना नया मोडल दिखाने के बारे में कोई विचार पहले?

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