所以我想通过导航控制器循环使用不同的视图控制器,但同时我希望能够循环回任何视图,而无需推送新实例。
红色视图始终是初始视图,用户将在单击项目另一部分中的按钮后转到该视图。
例如:
B =蓝色。红色=红色G =绿色。
R> Y>乙
如果我回到红色视图我不想创建视图的新实例,我想要检索导航堆栈中的视图。
我已经可以使用
检索导航控制器中的视图if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
if viewController is RedViewController {
print("Already initialized")
}
}
}
现在我正在做
self.navigationController?.pushViewController(controller, animated: false)
但它总是创建该视图的新实例。
我的问题是:是否可以在导航视图控制器中显示已初始化的特定视图?
我无法拍出好照片,但想象红色视图嵌入在导航控制器中。
答案 0 :(得分:1)
您可以使用setViewControllers()将堆栈的状态从一组视图控制器更改为另一组视图控制器。
let viewController = navigationController?.viewControllers
// remove unneeded view controllers from the stack
_ = navigationController?.setViewControllers(viewControllers, animated: true)
在您的示例中,当您获得堆栈数组时,它将包含R,Y和B,因此您可以删除Y和B以显示原始R视图控制器。
保持视图控制器永久加载的另一种方法是创建一个父视图控制器,它包含3个容器视图,一个在另一个之上。 (也许你需要阅读并试验容器视图,它是一个嵌入了视图控制器的视图)。每个容器视图都有一个嵌入其中的R,Y或B视图控制器。 您可以通过更改容器视图的alpha来在3个视图控制器之间切换。
即。为了显示R视图控制器,R容器的视图的α被设置为1.0,其中Y和B的容器视图' alpha设置为0.0