【问题标题】:How to navigate between controllers, swift如何在控制器之间快速导航
【发布时间】:2020-11-02 17:57:01
【问题描述】:
为了学习,我正在创建 iphone 笔记的模拟。我想在控制器之间进行导航。有两种方法:导航控制器和呈现/关闭方法。现在我用第二个。
我有三个屏幕:“笔记列表”、“观看笔记”屏幕和“编辑/制作笔记”屏幕。当我转到“existingNote -> edit existingNote”(从“笔记列表”发生“当前”,然后从“观察笔记”屏幕“呈现”),编辑它并保存,执行关闭(一次)和我的屏幕变成了“手表笔记屏幕”,没关系。但是当我做笔记(它发生在“笔记列表”屏幕上)并保存时,执行关闭,我的屏幕变成了“笔记列表”屏幕,但我想看到“手表笔记”屏幕,想看刚刚做了笔记.
我可以通过出席/解雇来做到这一点,还是必须使用 NavigationController?
【问题讨论】:
标签:
ios
swift
uinavigationcontroller
【解决方案1】:
使用出席/解雇:
做笔记后,您需要在“笔记列表”上静默显示“观看笔记”屏幕。这包括两个步骤:
- “笔记列表”屏幕应该知道“记笔记”正在被取消。您可以在两个控制器之间传递变量或使用
dismissViewControllerAnimated:completion
- 当您知道以上内容后,请从“笔记列表”中呈现“观看笔记”。记得使用
animated: false 否则用户会看到屏幕出现动画。
使用导航控制器:(强烈推荐)
-
导航控制器将为您提供更多的灵活性和在控制器之间移动的能力。您可以使用navigationController.popToViewController 弹出到所需的控制器列表/观看/制作/添加注释。
-
您的代码不会杂乱无章,而且易于维护。您无需传递变量或记住您来自哪个屏幕。您可以使用navigationController.viewControllers 了解堆栈中有哪些控制器。
【解决方案2】:
有一种方法可以识别您是通过导航控制器推送还是从视图控制器呈现,即isBeingPresented
isBeingPresented 在呈现视图控制器时为 true,在被推送时为 false。
-(void)viewWillAppear:(BOOL)动画{
[super viewWillAppear:animated];
if ([self isBeingPresented]) {
// being presented
DispatchQueue.main.async() {
self.dismiss(animated: true, completion: nil)
}
} else if ([self isMovingToParentViewController]) {
DispatchQueue.main.async() {
self.navigationController?.popViewController(animated: true)
}
}
}