我在ParentViewController内部展示一个视图控制器:
let item = getCurrentItem()
let presentViewController = viewController as! TestViewController
presentViewController.id = item.id
presentViewController.dismissController { // my custom delegate to inform the parent vc
self.dismiss(animated: true, completion: nil) // presenting view controller is closing then viewWillAppear will be triggered
}
self.present(presentViewController, animated: true, completion: nil)
但是,当调用dismiss时,ParentViewController的全局数组和变量将恢复为其初始值。
class ParentViewController {
// MARK: - Stored Properties
private let refreshControl = UIRefreshControl()
private var items = [String:[Item]]()
private var screenLoaded: Bool = false
// MARK: - Controller Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// after dismiss is called viewWillAppear gets hit but the "screenLoaded" is always false
if !screenLoaded {
screenLoaded = true
}
// items is initialised as well
}
private func openPopover() {
let item = getCurrentItem()
let presentViewController = viewController as! TestViewController
presentViewController.id = item.id
presentViewController.dismissController { // my custom delegate to inform the parent vc
self.dismiss(animated: true, completion: nil) // presenting view controller is closing then viewWillAppear will be triggered
}
self.present(presentViewController, animated: true, completion: nil)
}
}
调用关闭后,如何保持父视图控制器的原始状态?
最佳答案
经过数小时的研究,Apple终于找到了以下解决方案,它很适合我。希望它对将来的人有所帮助。
[https://developer.apple.com/documentation/uikit/uimodalpresentationstyle/overcurrentcontext][1]
presentViewController.modalPresentationStyle = .overCurrentContext
另外,如果有一个选项卡,则将显示样式设置为overCurrentContext时,子视图控制器的底部将位于其下方。解决方法是从窗口的rootViewController呈现子视图控制器。
sender.view.window?.rootViewController?.present(viewController, animated: true, completion: nil)
现在,当调用被调用时,不会触发viewWillAppear,并且我可以保留父视图控制器的数据及其状态。