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

时间:2014-04-22 11:36:38

标签: ios objective-c xcode xcode5.1

我正在使用Xcode 5.1.1中的iOS简单应用程序。 我是Xcode和Objective-C的新手,所以我有一点问题。 这就是我所拥有的: enter image description here

我的应用程序的想法非常简单 - 当用户第一次启动应用程序时,他会看到授权表单。当他输入他的登录名和密码并按登录时,我的应用程序向服务器发出请求,如果一切正常 - 登录和密码正确 - 应用程序保存用户登录:

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

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

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

授权工作很棒,用户登录保存操作系统。 但现在,当用户再次启动应用程序时,我需要打开“没关系”的视图,如果他已经授权:

- (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.
    }
}

请帮助我,如何解决我的问题? 附:我试着在谷歌和StackOverflow上找到我的问题的答案,但我发现并尝试使用的所有内容都没有帮助我。

4 个答案:

答案 0 :(得分:0)

保留一个标志,或在NSUserDefaults中存储bool值。通过这种方式,您可以跟踪用户是否已获得授权,您可以显示第二个视图,否则您可以加载登录表单。

答案 1 :(得分:0)

我的应用程序还处理一些授权流程(PIN注册)。我使用两个故事板。一个用于注册/登录进度(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;



 当我想更改故事板(登录/登出)时,我会调用类似的东西(也在App Delegate中声明:

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;
                }];

答案 2 :(得分:0)

而不是:

- (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];
    }
}

请务必在Interface Builder中为segue提供故事板ID。对于其他选项,check out this thread.

请不要在此引用我,但我相信每次要显示视图时都会调用viewWillAppear。因此,如果您来回浏览此视图,则需要确保用户已登录。

答案 3 :(得分:0)

只需将第二个VC(不是登录VC)设置为初始场景,然后使用委托。像这样:

在您的LoginVC中:

@protocol LoginViewControllerDelegate
    -(void)finishedLoggingInUser:(NSString *)userName;
@end


@interface LoginViewController : UIViewController {
    __unsafe_unretained id <LoginViewControllerDelegate> _delegate;
}

@property (nonatomic, assign) id <LoginViewControllerDelegate> delegate;

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

[_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];
}