在Xcode5中加载不同的视图控制器

我正在为Xcode 5.1.1中的一个简单的iOS应用程序工作。 我是Xcode和Objective-C的新手,所以我有一个小问题。 这是我的: 在这里输入图像说明

我的应用程序的想法很简单 – 当用户第一次启动应用程序时,他会看到授权表单。 当他input他的login名和密码,然后按login,我的应用程序向服务器请求,如果一切正常 – login名和密码是正确的 – 应用程序保存用户login:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:self.txtUsername.text forKey:@"SavedUserName"]; [defaults synchronize]; 

并用“没关系!”打开视图。

 [self performSegueWithIdentifier:@"login_success" sender:self]; 

授权是伟大的,用户login保存os工作。 但现在,当用户再次启动应用程序时,如果他已经授权:

 - (void)viewDidLoad { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *authLogin = [defaults objectForKey:@"SavedUserName"]; if(![authLogin isEqualToString:@""]){ //I think here application must load view with "It's OK!", but how to do this? //I tried to use here this - [self performSegueWithIdentifier:@"login_success" sender:self]; but it doesn't works. } } 

请帮帮我,如何解决我的问题? PS我试着在Google和StackOverflow上find我的问题的答案,但是我发现并尝试使用的所有内容都没有帮助我。

我的应用程序还处理一些授权stream程(PIN注册)。 我使用两个故事板。 一个用于注册/login进程(Login.storyboard),一个用于连接到服务。

下面的代码在应用程序中:didFinishLaunchingWithOptions:在一些初始化之后:

 // Set rootview (Check if user is registred) self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; if ([ccmpService isRegistered]) { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; self.window.rootViewController = [storyboard instantiateInitialViewController]; if (launchOptions) { NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; [self handleRemoteNotifications:remoteNotif]; } } else { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:nil]; self.window.rootViewController = [storyboard instantiateInitialViewController]; } [self.window makeKeyAndVisible]; return YES; 

当我想改变故事板(login/注销),我打电话像(也在应用程序委托声明:

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *sourcetVC = self.window.rootViewController; UIViewController *destVC = [storyboard instantiateInitialViewController]; [UIView transitionFromView: sourcetVC.view toView: destVC.view duration: 0.5 options: UIViewAnimationOptionTransitionFlipFromRight completion: ^(BOOL finished) { self.window.rootViewController = destVC; }]; 

保留一个标志,或在NSUserDefaults中存储一个布尔值。 这样,你可以跟踪用户是否已经授权,你可以显示第二个视图,否则你可以加载login表单。

而不是有:

- (void)viewDidLoad { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *authLogin = [defaults objectForKey:@"SavedUserName"]; if(![authLogin isEqualToString:@""]){ ... } }

我会说:

 - (void)viewWillAppear { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *authLogin = [defaults objectForKey:@"SavedUserName"]; if(![authLogin isEqualToString:@""]){ // programmatically invoke a push segue to the next view controller [self performSegueWithIdentifier:"pushToMyVC" sender:self]; } } 

一定要在界面生成器中给segue一个storyboard ID。 对于其他选项, 请查看此线程。

不要在此引用我的意思,但是我相信viewWillAppear在每次视图即将被显示时都会被调用。 所以,如果你来回导航到这个视图,你会想确保用户login。

只需将第二个VC(不是loginVC)设置为初始场景,然后使用委派。 像这样的东西:

在你的LoginVC中:

 @protocol LoginViewControllerDelegate -(void)finishedLoggingInUser:(NSString *)userName; @end @interface LoginViewController : UIViewController { __unsafe_unretained id <LoginViewControllerDelegate> _delegate; } @property (nonatomic, assign) id <LoginViewControllerDelegate> delegate; 

然后在LoginVC的实现中,在login之后触发委托方法:

 [_delegate finishedLoadingUserInfo:@"MyUsername"]; 

然后在最初的VC中,声明自己是LoginViewController的委托:

 #import "LoginViewController.h" @interface MyInitialViewController : UIViewController <LoginViewControllerDelegate> 

并在实现中实现委托方法:

 #pragma mark - LoginViewController Delegate Method -(void)finishedLoggingInUser:(NSString *)userName { // Do something with the user info self.loggedInUserName = userName; [self dismissViewControllerAnimated:YES completion:nil]; }