2012-04-19 13 views
11

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

लेकिन मैं इसे अपने ऐप प्रतिनिधि से कैसे ट्रिगर करूं?

क्या मैं अपने मुख्य स्टोरीबोर्ड में SignInViewController डालता हूं? यदि हां, तो मैं अपने ऐप प्रतिनिधि से अपने स्टोरीबोर्ड तक कैसे पहुंच सकता हूं? या कुछ और दृष्टिकोण बेहतर है?

उत्तर

24

आप हमेशा यूआईपीप्लिकेशन सिंगलटन के माध्यम से अपने ऐप प्रतिनिधि का संदर्भ ले सकते हैं। वहां से आप हमेशा अपना रूट व्यू कंट्रोलर प्राप्त कर सकते हैं। अपने रूट व्यू कंट्रोलर के साथ आप स्टोरीबोर्ड का संदर्भ प्राप्त कर सकते हैं।

एक बार जब आप अपनी कहानी बोर्ड प्राप्त कर लेते हैं तो आप जो दृश्य नियंत्रक चाहते हैं उसका एक उदाहरण तत्काल है। इसे प्रस्तुत करें।

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
MainViewController *mvc = (MainViewController *)appDelegate.window.rootViewController;  
LoginViewController *lvc = [mvc.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"]; 
[currentVC presentModalViewController:lvc animated:YES]; 

आपके स्टोरीबोर्ड का संदर्भ प्राप्त करने का एक और सीधा तरीका हो सकता है लेकिन यह लगभग हमेशा आपके लिए प्राप्त होगा।

+0

'currentVC' क्या है? – Andreas

+0

इसका मतलब है कि "वर्तमान" के स्थान पर कीवर्ड "स्वयं" का उपयोग करके वर्तमान में आप किस व्यू कंट्रोलर में काम कर रहे हैं, संदर्भित करते हैं। –

+5

लेकिन उन्होंने किसी भी व्यू कंट्रोलर में "पहले" ऐप डिलीगेट से पेश करने के बारे में पूछा, मैं शर्त लगाता हूं कि – Zerho

0

कहीं से भी एक दृश्य नियंत्रक दिखाने के लिए (ऐप प्रतिनिधि सहित), मैंने आईओएस 8+ में सफलता के साथ इस कोड का उपयोग किया है (मुझे पहले संगतता के बारे में निश्चित नहीं है)। यदि कोई है तो यह मोडल व्यू से पेश होगा।

YOURAppDelegate *appDelegate = (YOURAppDelegate *)[[UIApplication sharedApplication] delegate]; 
UINavigationController *rootNavC = (UINavigationController *)appDelegate.window.rootViewController; 
UIViewController *topVC = rootNavC.topViewController; 

UIViewController *myNewVC = [rootNavC.storyboard instantiateViewControllerWithIdentifier:<YOUR STORYBOARD ID>]; 

if (topVC.presentedViewController) 
{ 
    if ([topVC.presentedViewController class] == [UINavigationController class]) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [((UINavigationController*)topVC.presentedViewController) pushViewController:myNewVC 
                       animated:YES]; 
     }); 
    } 
    else 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [topVC.presentedViewController.navigationController pushViewController:myNewVC 
                      animated:animated]; 
     }); 
    } 
} 
else 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [rootNavC pushViewController:myNewVC 
          animated:animated]; 
    }); 
} 

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

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