2012-05-10 11 views
5

मैं एक ऐप पर काम कर रहा हूं कि लॉन्च होने पर वैध लॉगिन प्रमाण-पत्रों के लिए जांच की जाती है, और यदि वे पाए जाते हैं और समाप्त नहीं होते हैं तो मुख्य स्प्लिट व्यू कंट्रोलर प्रदर्शित होता है, और यदि लॉगिन स्क्रीन प्रदर्शित नहीं की जानी चाहिए।प्रदर्शन कर सकते हैं SegueWithIdentifier AppDelegate के साथ उपयोग किया जा सकता है?

प्रत्येक भाग अलग से काम कर रहा है, लेकिन मैं प्रदर्शित करने के लिए उचित दृश्य का चयन करने के लिए लॉन्च समय पर सबसे अच्छा तरीका से संघर्ष कर रहा हूं।

मैं जड़ दृश्य नियंत्रक से एक मॉडल segue स्थापित करने की कोशिश की है, और अपने आवेदन में: didFinishLaunchingWithOptions: अनुप्रयोग प्रतिनिधि में समारोह, इस बुला:

// Segue to the login view controller... 
if (loginNeeded) { 
    [self.window.rootViewController performSegueWithIdentifier:@"LoginScreen" sender:self]; 
} 

यह तार्किक काम करना चाहिए, लेकिन से segues ट्रिगर ऐप प्रतिनिधि के भीतर असंभव प्रतीत होता है।

इसे संभालने के लिए आदर्श स्थान और तकनीक क्या है?

+0

आप प्रतिनिधि को क्यों फेंक रहे हैं? 'ViewdidLoad' – Sirens

उत्तर

4

इस पोस्ट hiding-a-segue-on-login-process के अनुसार आप एक कस्टम सेगू आज़मा सकते हैं।

वैकल्पिक रूप से अगर तुम से पहले विभाजित दृश्य नियंत्रक लोड निम्नलिखित लाइनों के साथ कुछ कोशिश लॉगिन प्रदर्शन के लिए बेताब हो ...

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

स्टोरीबोर्ड पर, अपनी लॉगिन कक्षा से मूल स्प्लिट व्यू कंट्रोलर तक एक नया सीगू बनाएं। इसे पहचानकर्ता दें, 'Load SplitViewController' और एक सेग्यू कस्टम क्लास नाम जिसे हम FullyReplaceSegue पर कॉल करेंगे। पर UIStoryboardSegue और यह FullyReplaceSegue ऊपर के अनुसार नाम आधारित

[self performSegueWithIdentifier:@"Load SplitViewController" sender:self]; 

नई segue कक्षा बनाएं,:

अपना लॉगिन वर्ग मीटर फ़ाइल में कोड जोड़ने के एक बार उपयोगकर्ता में लॉग इन किया है कहा जाता है।

ज फ़ाइल

#import <UIKit/UIKit.h> 
@interface : UIStoryboardSegue 

@end 

मीटर फ़ाइल

#import "FullyReplaceSegue.h" 

@implementation FullyReplaceSegue 

- (void)perform 
{ 
    UIViewController *dest = (UIViewController *) super.destinationViewController; 
    UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    window.rootViewController = dest; 

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     UISplitViewController *splitViewController = (UISplitViewController *)dest; // assumes we're transitioning to a UISplitViewController! 
     UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
     splitViewController.delegate = (id)navigationController.topViewController; 
    } 
} 

@end 
+0

मैंने इसे आजमाने की कोशिश नहीं की, लेकिन ये एक बेहद चालाक समाधान की तरह लग रहा है। – radven

1

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

+0

पर पहली चीज़ क्यों न करें ऐप्पल को यह आवश्यक है कि स्प्लिट व्यू कंट्रोलर रूट हो, इसलिए वास्तव में दृश्य में टैप करने की जगह नहीं है जब तक कि मैं subclass नहीं करता। ऐसा लगता है कि एक आसान तरीका होना चाहिए। – radven

+0

तो रूट को विभाजित करें और अपने दृश्य नियंत्रकों के दृश्य लोड देखें। विचार वही है। – jmstone617

+0

मैंने अभी कोशिश की है - और दृश्य में seguesDidLoad काम नहीं कर रहे हैं। मैंने यहां कुछ और विवरणों के साथ एक अलग लेकिन संबंधित प्रश्न पूछा है: http://stackoverflow.com/questions/10541852/correctly-present-conditional-login-screen-at-app-startup-with-storyboards-and-s – radven

4

यहाँ कैसे मैंने किया है।

didFinishLaunchingWithOptions में:

//save the root view controller 
[[self window] makeKeyAndVisible]; 
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
rootController = [[navigationController viewControllers] objectAtIndex:0]; 

किसी और एप्लिकेशन प्रतिनिधि में कहीं न कहीं:

[rootController performSegueWithIdentifier:@"fileSegueID" sender:self]; 

फिर, स्टोरीबोर्ड में, का मानना ​​है कि "के रूप में rootController" सौंप दिया जाता है से एक segue, को बनाने के वांछित वैकल्पिक दृश्य, और उस नए segue आईडी fileSegueID दें।यह सुनिश्चित करने के लिए कुछ डिबगिंग लेती है कि rootController चर सही दृश्य को सौंपा गया है।

+2

धन्यवाद! '[[स्वयं खिड़की] makeKeyAndVisible];' मैं क्या लापता था। –

2

शायद थोड़ा देर हो चुकी है, लेकिन मैं वही सुझाव ढूंढ रहा था। यहां मैं क्या कर रहा हूँ।

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Signup" bundle:nil]; 
    if(isLoggedIn) { 
    UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 
    IndexController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"IndexController"]; 
    [navigationController pushViewController:ivc animated:NO]; 
} 
0

हां, यदि आप segue के मूल दृश्य नियंत्रक का संदर्भ प्राप्त करते हैं, तो इसका उपयोग किया जा सकता है। आप इसे इस तरह प्राप्त कर सकते हैं:

UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 

[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"LoginScreen" sender:self]; 

यह तभी viewControllers सरणी में सूचकांक आपके विचार नियंत्रक से मेल खाता है और अगर यह निश्चित रूप से मौजूद है काम करेंगे। इस मामले में पहला (सरणी और स्टोरीबोर्ड में) है।

segue ("loginScreen") किसी क्रिया से जुड़ा नहीं होना चाहिए। जिस तरह से आप यह करते हैं, स्टोरीबोर्ड दृश्य के नीचे गंतव्य दृश्य आइकन पर फ़ाइल स्वामी आइकन से नियंत्रण-खींचकर होता है। एक पॉपअप दिखाई देगा जो "मैनुअल सेग्यू" में एक विकल्प मांगेगा; प्रकार के रूप में "पुश" चुनें। छोटे वर्ग पर टैप करें और सुनिश्चित करें कि आप विशेषता निरीक्षक में हैं। इसे एक पहचानकर्ता दें जिसे आप कोड में संदर्भित करने के लिए उपयोग करेंगे।

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