Ios 在不调用每个ViewDidDisplay的情况下解除对rootViewController的访问
我的视图控制器类似于MainView->NavigationController A->ViewController A->ViewController B->ViewController C,我想关闭ViewController(A、B和C)并再次显示MainView。。。我用这条线Ios 在不调用每个ViewDidDisplay的情况下解除对rootViewController的访问,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,我的视图控制器类似于MainView->NavigationController A->ViewController A->ViewController B->ViewController C,我想关闭ViewController(A、B和C)并再次显示MainView。。。我用这条线 self.view.window?.rootViewController?.dismiss(animated: false, completion: nil) 而且效果很好。。问题是,在关闭ViewContr
self.view.window?.rootViewController?.dismiss(animated: false, completion: nil)
而且效果很好。。问题是,在关闭ViewController(A、B和C)时,它会调用每个ViewDidDisplay,并运行我不希望运行的代码。。在不调用每个viewController的情况下关闭并返回MainView的最佳做法是什么?以下是如何通过Sotryboard执行此操作。我不知道如何通过代码来做到这一点。我希望有帮助 在MainViewController中添加以下内容:
@IBAction func unwindToMainView(segue:UIStoryboardSegue) { }
在所有其他ViwController(视图控制器A、视图控制器B、视图控制器C)中,
像这样单击并拖动
然后选择您在mainVC中添加的segue
现在选择该序列并给它一个标识符
从这里,您可以在任何需要的地方使用该标识符执行segue。我用这个按钮来执行这个步骤
您必须有其他导致问题的代码 这是一个完整的例子
是起始视图控制器PresDisViewController
- 其按钮创建一个导航控制器,其根为
ViewControllerA
有一个按钮可按下ViewControllerA
ViewControllerB
有一个按钮可以按下ViewControllerB
ViewControllerC
有一个按钮,可以执行您的ViewControllerC
self.view.window?.rootViewController?.dismission(动画:false,完成:nil)
ViewDidAspect()
,并将自身打印到调试控制台
运行时的输出:
viewDidAppear scratchy.PresDisViewController
viewDidAppear scratchy.ViewControllerA
viewDidAppear scratchy.ViewControllerB
viewDidAppear scratchy.ViewControllerC
viewDidAppear scratchy.PresDisViewController
如您所见,当导航控制器关闭时,VCs中不会调用viewdide
import UIKit
class ViewControllerA: UIViewController {
let btn: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setTitle("Do Push", for: .normal)
v.backgroundColor = .red
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn)
NSLayoutConstraint.activate([
btn.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -40.0),
btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
])
btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)
}
@objc func didTap(_ sender: Any?) -> Void {
let vc = ViewControllerB()
self.navigationController?.pushViewController(vc, animated: true)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear", NSStringFromClass(self.classForCoder))
}
}
class ViewControllerB: UIViewController {
let btn: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setTitle("Do Push", for: .normal)
v.backgroundColor = .systemYellow
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn)
NSLayoutConstraint.activate([
btn.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0.0),
btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
])
btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)
}
@objc func didTap(_ sender: Any?) -> Void {
let vc = ViewControllerC()
self.navigationController?.pushViewController(vc, animated: true)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear", NSStringFromClass(self.classForCoder))
}
}
class ViewControllerC: UIViewController {
let btn: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setTitle("Do Dismiss", for: .normal)
v.backgroundColor = .blue
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn)
NSLayoutConstraint.activate([
btn.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 40.0),
btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
])
btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)
}
@objc func didTap(_ sender: Any?) -> Void {
self.view.window?.rootViewController?.dismiss(animated: false, completion: nil)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear", NSStringFromClass(self.classForCoder))
}
}
class PresDisViewController: UIViewController {
let btn: UIButton = {
let v = UIButton()
v.translatesAutoresizingMaskIntoConstraints = false
v.setTitle("Do Present", for: .normal)
v.backgroundColor = .orange
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn)
NSLayoutConstraint.activate([
btn.topAnchor.constraint(equalTo: view.topAnchor, constant: 60.0),
btn.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
])
btn.addTarget(self, action: #selector(didTap(_:)), for: .touchUpInside)
}
@objc func didTap(_ sender: Any?) -> Void {
let vcA = ViewControllerA()
let navVC = UINavigationController(rootViewController: vcA)
navVC.modalPresentationStyle = .fullScreen
present(navVC, animated: true, completion: nil)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("viewDidAppear", NSStringFromClass(self.classForCoder))
}
}
@Sammy 1-我不使用故事板2-我将每个视图显示为全屏视图这是我转到ViewController A的代码让vc=ViewControllerA()让navigationController=UINavigationController(rootViewController:vc)navigationController.modalPresentationStyle=.fullScreen senderVC.present(navigationController,动画:true,完成:nil)