可以使用故事板登录屏幕吗?

时间:2011-10-27 09:10:14

标签: ios5 storyboard

我正在使用新的iOS 5功能并尝试使用新的故事板功能将我的应用程序重写为纯iOS 5应用程序。

简而言之,我有一个开始屏幕,如果用户保存了一些登录数据,应用程序会尝试连接到服务器,如果没有,它应该要求它们。

我将如何做到这一点。我创建了一个Viewcontroller,它在viewDidLoad方法中进行连接。如果没有登录数据或登录不成功,我需要在登录屏幕上手动设置。

现在这是可能的,还是我需要2个故事板呢?

4 个答案:

答案 0 :(得分:20)

我已经通过放置一个没有任何segues的登录视图(来自或来自它)解决了它,如下面的屏幕截图所示:

enter image description here

然后,我在标签栏控制器中使用自定义类,以便在需要时显示它。

在标签栏控制器类中,我使用'viewDidLoad'来启动登录视图。为了显示模态视图,我确实有一个存储某些状态的单例东西,比如BOOL isAuthenticated,我在那里做了魔术:

- (void) performLoginIfRequired: (UIViewController *) source {

   if (!self.isAuthenticated) {

       NSLog(@"Is not authed");

       UIStoryboard *storyboard = [UIApplication sharedApplication].delegate.window.rootViewController.storyboard;

       UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"loginScreen"];

       [source presentModalViewController:loginController animated:YES];

   } else {
       NSLog(@"Is authe");

   }
}

而且,在我的情况下,我希望它在应用程序首次启动时显示,但也会在它再次进入前景时显示。所以,我在通知中心注册了我的标签栏控制器,因此如果应用程序回来,我会收到通知:

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(willEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}

在willEnterForeground方法中,我这样做:

-(void) willEnterForeground: (NSNotification *)notification {
    [[myStateThingy defaultState] performLoginIfRequired:self]; 
}

答案 1 :(得分:8)

听起来你需要使用performSegueWithIdentifier方法。确保两个视图都在同一个故事板中,使用Push segue将它们链接在一起,并为该segue命名。然后,从您的第一个视图控制器的代码中简单地调用performSegueWithIdentifier来执行手动segue。

希望这有帮助!

另请参阅:Conditionally following a segue

干杯, Jesse L. Zamora

答案 2 :(得分:3)

我有同样的问题,我只是通过执行以下操作解决了这个问题:我没有尝试将转换为登录屏幕(模态或推送),而是将登录屏幕设为我的根视图控制器。在登录视图控制器的viewWillAppear方法中,我检查是否有人已登录。如果是这样,我按下我的主屏幕:

// mutableFetchResults is an array with my persistent Credentials object
if ([mutableFetchResults count] > 0) { // Someone's already logged in
  [self performSegueWithIdentifier:@"Home" sender:self];
}

此外,在主屏幕视图控制器的viewWillAppear方法中,我用此行隐藏了后退按钮,因此用户无法“返回”登录屏幕:

self.navigationItem.hidesBackButton = YES;

最后,我的应用的每个页面右上角都有一个“注销”栏按钮。注销并放置登录屏幕就像这样简单:

- (IBAction)signOutButtonPressed:(UIBarButtonItem *)sender {
  MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
  [appDelegate signOutCurrentUser]; // this method in my app delegate deletes the current Credentials
  [self.navigationController popToRootViewControllerAnimated:YES];
}

希望这很简单!

答案 3 :(得分:0)

在尝试了许多不同的方法之后,我能够用这个来解决这个问题:

-(void)viewWillAppear:(BOOL)animated {

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        self.view.hidden = YES;
    }
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        [self performSegueWithIdentifier:@"homeSeg3" sender:self];
    }
}

-(void)viewDidUnload {
    self.view.hidden = NO;
}