如何正确地关闭模态视图控制器?

3

在我的自定义TabBarController中,我为每个选项卡设置了NavigationController。

let viewController = [HomeViewController(), ProfileViewController()]
let navControllers = viewControllers.map { return UINavigationController(rootViewController: $0) }
setViewControllers(navControllers, animated: false)

在我的HomeViewController中,我有一个CollectionView,当选中其中一个单元格时,它会将我的VideoPlayerViewController推到导航控制器中。然后,VideoPlayerViewController以模态方式呈现了一个ViewController:

class PopoverViewController: UIViewController {
    @IBAction func presentPopover() {
        let popoverViewController = PopoverViewController()
        popoverViewController.modalPresentationStyle = .fullScreen
        popoverViewController.delegate = self
        present(popoverViewController, animated: true, completion: nil)
    }
}

在我的PopoverViewController中,我有一个关闭按钮,它调用了VideoPlayerViewController中的委托方法。
class PopoverViewController: UIViewController {
    @objc func closeTapped() {
        delegate?.willClose(self)
    }
}

extension VideoPlayerViewController: PopoverViewControllerDelegate {
    func willClose(_ viewController: PopoverViewController) {
        viewController.dismiss(animated: true, completion: nil)
    }
}

在我的 PopoverViewController 上调用 dismiss 函数时,不仅会关闭模态 ViewController,还会从 NavigationController 弹出 VideoPlayerViewController 并返回到 rootViewController(HomeViewController)。
我想要回到 VideoPlayerViewController,并只关闭 PopoverViewController 而不是弹出 VideoPlayerViewController。

尝试在closeTapped中关闭PopoverViewController。顺便问一下,当选择一个单元格时,你是使用present还是push来展示VideoPlayerViewController - mahan
@mahan 我正在将 VideoPlayerViewController 推送到我的 NavigationController。我尝试在 closeTapped 中直接关闭 PopoverViewController,但仍然得到相同的结果。 - Giorgio Doganiero
在你的代码中,你有 PopoverViewController.modalPresentationStyle = .fullScreen,其中大写的 P,这是错误还是你将其设置在类上而不是实例上? - Jakub Skořepa
@JakubSkořepa 感谢您指出这个错误,这是一个笔误,我在我的代码中已经正确地修改了它。 - Giorgio Doganiero
1个回答

2
您正在对VideoPlayerViewController调用dismiss。应该在PopoverViewController上执行此操作,如下所示:
class PopoverViewController: UIViewController {
    @objc func closeTapped() {
        dismiss(animated: true, completion: nil)
    }
}

当这样做时,它会做同样的事情。它会把我扔回 NavigationController 的 rootViewController,而不仅仅是回到 VidePlayerViewController。 - Giorgio Doganiero
请问您能否分享一下如何呈现 PopoverViewController 的代码? - πter
它在那里,我只需初始化PopoverViewController并使用present(popoverViewController,animated:true,completion:nil)在我的VideoPlayerViewController中呈现它。 - Giorgio Doganiero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接