我在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,并且我可以保留父视图控制器的数据及其状态。

10-08 05:25