推送的视图控制器的数量没有限制。例如,在viewDidLoad 上的代码中添加手势识别器并放置一些断点来查看那里发生了什么可能会更容易。
要玩转这些东西,你可以试试这个极简代码,它会在每次点击时推送一个新的视图控制器。您可以创建一个新项目并简单地覆盖自动生成的 ViewController 的内容,一切都应该可以工作:
import UIKit
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
present(UINavigationController(rootViewController: MyViewController()), animated: true, completion: nil)
}
}
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap)))
self.title = "View controller \(navigationController?.viewControllers.count ?? 0)"
}
@objc private func onTap() {
navigationController?.pushViewController(MyViewController(), animated: true)
}
}
解释一下:
ViewController 的实例将在您的主窗口中创建为根视图控制器,它是项目设置(要使用的情节提要)的一部分,也是名为 main 的自动生成情节提要的一部分。
我们需要等待第一个视图控制器的视图出现,然后才能展示我们的新导航视图控制器。我们提出了一个根视图控制器作为我们自己的视图控制器子类,称为MyViewController。此视图控制器不在情节提要中。
当MyViewController 的实例进入层次结构(使用push 或present)时,将调用viewDidLoad,它会创建一个点击手势识别器,该识别器设置为推送MyViewController 的新实例的方法。我们还根据导航控制器上的视图控制器数量设置标题,以获取更多信息。
如前所述,这是一个简约的代码。但总的来说,您会执行以下操作:
override func viewDidLoad() {
super.viewDidLoad()
view.addGestureRecognizer({
let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(onSwipeLeft))
swipeRecognizer.direction = .left
return swipeRecognizer
}())
}
@objc private func onSwipeLeft() {
let controllerToBePushed = UIStoryboard(name: "my_storyboard_name", bundle: nil).instantiateViewController(withIdentifier: "the_identifier_I_set_in_storyboard") as! WhateverTheTypeOfMyViewControllerIs
navigationController?.pushViewController(controllerToBePushed, animated: true)
}