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