我正在使用新的iOS 5功能并尝试使用新的故事板功能将我的应用程序重写为纯iOS 5应用程序。
简而言之,我有一个开始屏幕,如果用户保存了一些登录数据,应用程序会尝试连接到服务器,如果没有,它应该要求它们。
我将如何做到这一点。我创建了一个Viewcontroller,它在viewDidLoad方法中进行连接。如果没有登录数据或登录不成功,我需要在登录屏幕上手动设置。
现在这是可能的,还是我需要2个故事板呢?
答案 0 :(得分:20)
我已经通过放置一个没有任何segues的登录视图(来自或来自它)解决了它,如下面的屏幕截图所示:
然后,我在标签栏控制器中使用自定义类,以便在需要时显示它。
在标签栏控制器类中,我使用'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;
}