尝试关闭弹出视图控制器 Swift 时没有任何反应

Posted

技术标签:

【中文标题】尝试关闭弹出视图控制器 Swift 时没有任何反应【英文标题】:nothing happens on trying to dismiss popover viewcontroller Swift 【发布时间】:2017-02-25 19:00:02 【问题描述】:

我有一个视图控制器,当用户单击 ImageView 时,它显示为弹出框。 问题是,我添加了一个按钮来关闭它,但是当我点击它时没有任何反应。 我的代码是:

 @IBAction func onCloseTapped(_ sender: Any) 
presentedViewController?.dismiss(animated: true, completion: nil)

我也试过dismiss(animated: true, completion: nil)等方法,还是不行。

谁能告诉我我做错了什么?

编辑: 发布截图:

编辑 2:我从情节提要中呈现它。我在图像上添加了一个手势识别器,然后从情节提要中添加了 segue,显示为 popover,然后锚定到图像。

【问题讨论】:

控制器是如何呈现的?您是否验证了 onCloseTapped 方法实际上正在被调用? 当用户点击图像时,我会展示它。然后我放置了一个按钮并注意到点击它时发生的情况,代码与上面相同。 我问的不是你什么时候展示,而是你如何展示。 Edit您的问题与相关代码显示您如何显示您无法关闭的控制器。 我已经编辑了帖子。 【参考方案1】:

它不起作用,因为当您显示为弹出框时,viewController 没有导航控制器。您必须创建一个委托方法并使用 viewController 上的解除函数来调用弹出框。

这里是一个例子:

在弹出框视图控制器中制作弹出框委托:

protocol PopoverViewControllerDelegate: NSObjectProtocol 
    func dismiss()

然后你创建一个委托变量并在点击按钮时调用:

var delegate: PopoverViewControllerDelegate?

@IBAction func onCloseTapped(_ sender: Any) 
        delegate?.dismiss()

现在在调用 popover 的 viewController 中,您重写 prepare for segue 方法来设置 popover 委托:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "popover" 
            if let vc = segue.destination as? PopoverViewController 
                vc.delegate = self
            
        
    

现在你只需要使用代理来关闭你的弹出视图控制器:

extension ViewController: PopoverViewControllerDelegate 
    func dismiss() 
        navigationController?.dismiss(animated: true, completion: nil)
    

别忘了把标识符给你segue,我们使用的标识符是this = "popover"

希望对你有所帮助。

【讨论】:

以上是关于尝试关闭弹出视图控制器 Swift 时没有任何反应的主要内容,如果未能解决你的问题,请参考以下文章

弹出窗口关闭时如何在主视图控制器中快速运行代码

如何在 swift 中使文本字段功能在 tableview 中

单击 uibutton 时关闭弹出窗口

关闭一个自定义弹出窗口UIViewController并立即显示另一个自定义弹出窗口UIViewController -SWIFT

如何在没有 Storyboard 的情况下推送新视图 Swift

在其他地方点击时关闭弹出视图控制器