swift - 如何在 Swift 中从目标 View Controller 中关闭弹出框

标签 swift popover

我有一个主视图 Controller ,它已在 Interface Builder 中设置为通过连接到按钮的弹出框 segue 打开一个 TableView Controller 。当在 didSelectRowAtIndexPath 中选择弹出窗口 TableView 中的项目时,我希望能够关闭弹出窗口。在 Objective-c 中,我可以将 prepareForSegue 委托(delegate) 中的 segue 强制转换为 UIStoryboardPopoverSegue,并将其 UIPopoverController 传递给 TableView Controller 。但是,在 Swift 中,我的向下转换失败了,因为它将 segue 视为 UIStorybaordPopoverPresentationSegue 类型(当使用调试器单步执行时),这似乎不是公共(public) API。

这是我的代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "ShowCollectionsSegue" {
        if let collController:CollectionsTableViewController! = segue.destinationViewController as? CollectionsTableViewController {
            if let popoverSegue = segue as? UIStoryboardPopoverSegue { // <-- This fails
                collController.popover = popoverSegue.popoverController
            }
        }
    }
}

如何将 segue 强制转换为 UIStoryboardPopoverSegue 以访问其 popoverController 属性?

我愿意解决以不同方式响应 TableView 单元格点击而关闭弹出窗口的问题,但似乎当使用 Storyboard 中的 segue 时,关闭弹出窗口的唯一方法是按住以某种方式引用 popover Controller ,据我所知,唯一的方法是将 segue 转换为 Swift 不想让我这样做的 popover segue。有什么想法吗?

最佳答案

的确是个奇怪的问题。我在文档中注意到,UIStoryboardPopoverSegue 从任何类继承。这解释了为什么转换不起作用 - UIStoryboardSegue 不是它的父类(super class)。所以我只是尝试创建一个新对象 - 它看起来很奇怪但有效:

let popoverSegue = UIStoryboardPopoverSegue(
   identifier: segue.identifier, 
   source: self, 
   destination: segue.destinationViewController as UIViewController)
println("Is there a controller? \(popoverSegue.popoverController.description)")
// YES !!

编辑

但是这个 Controller 不会关闭弹出窗口:(

解决方法是将 Interface Builder 中的 segue 指定为“Deprecated Segues : Popover”。那么代码就会如预期的那样

let popoverSegue = segue as  UIStoryboardPopoverSegue
if let destination = segue.destinationViewController as? TableViewController {
   destination.delegate = self
   self.popoverController = popoverSegue.popoverController
}

关于swift - 如何在 Swift 中从目标 View Controller 中关闭弹出框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25771357/

相关文章:

ios - 现有 CollectionView 图像在滚动时发生变化

ios - 如何在 iOS 上的给定日期执行后台任务?

xcode - iOS 9 首次启动时黑屏

javascript - Twitter bootstrap popover : How to hide it on click outside, 不使用 body/document 事件处理程序?

css - 更改 Bootstrap 弹出窗口的样式

jquery - 在 Bootstrap 弹出窗口中嵌入 jQuery slider

ios - 当重复使用自定义 tableView 单元格时,相同的 subview 会重复显示(Swift 4.1)

ios - 让用户更新密码 - 解析 - Swift

javascript - 单击其他任何内容时如何关闭弹出窗口

php - Bootstrap Popover 不会改变 while 循环中的值