2015-01-20 63 views
0

我正在开发一个需要身份验证到后端的iOS 8应用程序。我想以这样一种方式制作应用程序,如果应用程序收到HTTP 403错误,用户会看到一个登录屏幕。在登录屏幕视图控制器成功认证用户后,应用程序应该导航回到前一个屏幕(无论它是什么屏幕)。导航到iOS上的前一个场景8

在Xcode 6中,我可以看到在场景之间导航的首选方式是通过segse。因此,我用塞格斯导航从登录屏幕的背面,使用此代码:

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

,这提出的问题是,我将不得不建立塞格斯到应用程序中的所有场景,其中的任何可能会触发认证请求。因此,我想问一个推荐的方法来实现这个导航要求。

我是新来的iOS8和一般的iPhone编程,所以它可能是我没有完全清楚iOS 8的导航概念,我使用了一种错误的方法。

回答

1

展开细分与前进细分不同,这使得支持后续功能非常简单。

在创建展开segue之前,您需要向视图控制器添加一个方法,以便将其展开。例如 -

- (IBAction)unwindFromLogin:(UIStoryboardSegue*)sender { 
} 

(如果要触发与performSegueWithIdentifier开卷或场景中的UIViewController对象),并在退出图标即可创建按Ctrl拖动场景中的物体之间的开卷SEGUE屏幕的底部。然后界面生成器将显示它找到的符合上述签名的方法列表(因此它将显示unwindFromLogin:)。你可以给这个segue一个标识符,这样你可以像平常一样用performSegueWithIdentifier来调用它。到现在为止还挺好。

现在,为聪明的一点。在运行时,调用unwind segue时,iOS将通过当前视图控制器堆栈查找实现指定方法的第一个视图控制器 - 因此,如果在每个视图控制器中实现相同的unwindFromLogin:方法,则您的登录视图将展开为它来自的视图控制器,你只需要在你的登录视图控制器场景中放置一个简单的细节。

Apple有一个很好的Tech Note,它更详细地描述了展开过程,以及如何通过在UIViewController子类中实现其他方法来定制它,但默认实现应该适合您的需求。

如果你不想创建从每个源视图控制器登录视图控制器赛格瑞你可以直接使用类似目前它 -

LoginViewController *loginVC=(LoginViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"loginVC"]; 
[self presentViewController:loginVC animated:YES completion:nil]; 

你仍然可以使用回卷SEGUE找回

+0

谢谢你们的全面解答。谜题仍然缺少的是,我如何实现从每个屏幕到登录屏幕的导航?我是否必须从每个场景向登录场景建立IB连线,还是有一种更容易的,程序化的方式将这种行为构建到场景中? – 2015-01-20 22:05:58

1

我不认为使用segues总是最好的方法。在这种情况下,使用-popToViewController:animated:可能会更好。

这就是说,使用放松功能仍然可以在这里工作。我建议创建一个自定义视图控制器,它的子类为UIViewController。此视图控制器实现您的-unwindXXX:方法。

@interface MYBaseViewController : UIViewController 
- (IBAction)unwindXXX:(UIStoryboardSegue *)sender; 
… 
@end 

让所有可以从登录视图控制器解开的视图控制器继承此自定义视图控制器。

@interface MYNewsFeedViewController : MYBaseViewController 
… 
@end 
0

我认为下面的两个答案是有效的,我都投了给他们。

但是,经过测试,我发现这种方法对我的场景来说更简单和麻烦。

在可以触发登录提示任何屏幕,我强制登录屏幕通过调用下面的方法来呈现:

LoginViewController *loginView = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; 
[self presentViewController:loginView animated:YES completion:nil]; 

然后,为了使成功后用户所需的后退导航功能验证的登录界面,登录界面调用这个方法,它返回到预览场景:

[self dismissViewControllerAnimated:YES completion:nil]; 

由于我是新来的iOS开发,我不知道这是继推荐的做法,所以我像人们对w发表评论不管这是不是推荐的方法。