2014-04-22 38 views
0

我正在使用Xcode 5.1.1中的iOS简单应用程序。 我是Xcode和Objective-C的新手,所以我有一个小问题。 这是我的: enter image description here在Xcode5中加载不同的视图控制器

我的应用程序的想法很简单 - 当用户第一次启动应用程序,他看到授权形式。当他进入自己的登录名和密码,然后按登录,我的应用程序使请求服务器,如果一切正常 - 登录名和密码是正确的 - 应用程序保存用户登录:

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

,并以“这是确定,打开视图!”。

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

授权是伟大的工作,用户登录保存os作品。 但是现在,当用户启动应用程序再次,我需要用“这是OK”,如果他已经授权开放的观点:

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

请帮帮我,怎么解决我的问题呢? P.S.我尝试在Google和StackOverflow上找到关于我的问题的答案,但是我找到并尝试使用的所有内容都无济于事。

+0

我想你应该尝试使用的AppDelegate: ' - (BOOL)申请:(UIApplication的*)应用程序didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions',并做一些检查在那里。 因为我看到你正在做一个' - (void)viewDidLoad',它在ViewController中进行_already authorized_检查。所以我想你总是打开_Authorization_视图,如果你被授权,你去_OK_视图?! – ySiggen

+0

是的,你是对的!嗯..我应该在哪里放置' - (BOOL)应用程序:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions'? – Evgeny

+0

我在AppDelegate.m中找到它。这是吗?) – Evgeny

回答

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代表也宣布:

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

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

+0

嗯)但我的问题是如何显示第二个视图,如果用户已经授权?) – Evgeny

+0

因此,如果用户已被授权,你希望你的应用程序以第二个VC开始? – NKB

+0

是的!这是我需要的! ;) – Evgeny

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

一定要给予SEGUE故事板ID在Interface Builder。对于其他选项,check out this thread.

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

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的实施,断火的委托方法记录它们在后:然后在初始VC

[_delegate finishedLoadingUserInfo:@"MyUsername"]; 

,声明自己是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]; 
} 
相关问题