我正在开发一个需要对后端进行身份验证的iOS 8应用程序。我想以这样的方式制作应用程序:如果应用程序收到HTTP 403错误,则会向用户显示登录屏幕。登录屏幕视图控制器成功验证用户后,应用程序应导航回上一个屏幕(无论屏幕是什么)。
在Xcode 6中,我可以看到在场景之间导航的首选方式是通过segues。因此,我使用segues从登录屏幕导航回来,使用以下代码:
[self performSegueWithIdentifier:@"UnwindToNewsfeed" sender:self];
这提出的问题是,我必须为应用程序内的所有场景建立segue,因为它们中的任何一个都可能触发身份验证请求。因此,我想请求一种推荐的方法来实现这个导航要求。
我是iOS8和iPhone编程的新手,所以可能我没有完全清楚iOS 8的导航概念而且我使用了错误的方法。
答案 0 :(得分:1)
Unwind segue与前向segue不同,这使得支持你所使用的功能变得非常简单。
在创建展开segue之前,您需要向要放松的视图控制器添加方法。例如 -
- (IBAction)unwindFromLogin:(UIStoryboardSegue*)sender {
}
然后,您可以通过在场景中的对象(或场景的UIViewController对象,如果您想要使用performSegueWithIdentifier
触发展开)和底部的退出图标之间进行ctrl拖动来创建展开segue。屏幕。然后,Interface Builder将显示它找到的与上面的签名匹配的方法列表(因此它将显示unwindFromLogin:
)。您可以为此segue指定一个标识符,以便您可以像通常那样使用performSegueWithIdentifier
调用它。到目前为止一切都很好。
现在,对于聪明的一点。在调用unwind segue的运行时,iOS会查看当前视图控制器堆栈以查找实现指定方法的第一个视图控制器 - 因此,如果在每个视图控制器中实现相同的unwindFromLogin:
方法,则需要登录视图将展开到它来自的视图控制器,您只需在登录视图控制器场景中单个展开segue。
Apple有一个很好的Tech Note,它更详细地描述了展开过程,以及如何通过在UIViewController
子类中实现其他方法来自定义它,但默认实现应该适合您的需要。
如果您不想从每个源视图控制器创建一个segue到登录视图控制器,您可以使用类似的东西直接显示它 -
LoginViewController *loginVC=(LoginViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"loginVC"];
[self presentViewController:loginVC animated:YES completion:nil];
你仍然可以使用unwind segue取回
答案 1 :(得分:1)
我认为使用segues始终是最好的方法。在这种情况下,最好使用-popToViewController:animated:
。
那就是说,使用放松仍然可以在这里工作。我建议创建一个子类UIViewController
的自定义视图控制器。此视图控制器实现了您的-unwindXXX:
方法。
@interface MYBaseViewController : UIViewController
- (IBAction)unwindXXX:(UIStoryboardSegue *)sender;
…
@end
让所有可以从登录视图控制器解开的视图控制器继承此自定义视图控制器。
@interface MYNewsFeedViewController : MYBaseViewController
…
@end
答案 2 :(得分:0)
我认为下面的两个答案是有效的,我把它们都投了。
然而,经过测试,我发现这种方法更简单,也不那么麻烦。
在任何可以触发登录提示的屏幕上,我通过调用以下方法强制显示登录屏幕:
LoginViewController *loginView = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginView"];
[self presentViewController:loginView animated:YES completion:nil];
然后,为了在用户在登录屏幕中成功验证后启用所需的后退导航功能,登录屏幕将调用此方法,该方法将返回到预览场景:
[self dismissViewControllerAnimated:YES completion:nil];
由于我是iOS开发人员的新手,我不确定这是否遵循建议的做法,所以我希望人们评论这是否是推荐的方法。