如何从Swift中的目标视图控制器中解除Popover

时间:2014-09-10 17:18:19

标签: swift popover

我有一个主视图控制器,已在Interface Builder中设置,通过连接到按钮的popover segue打开一个表视图控制器。我希望能够在didSelectRowAtIndexPath中选择弹出表格视图中的项目时解除弹出窗口。在Objective-c中,我可以将prepareForSegue delegate中的segue类型转换为UIStoryboardPopoverSegue并将其UIPopoverController传递给表视图控制器。但是,在Swift中,我的downcast失败了,因为它将segue视为类型UIStorybaordPopoverPresentationSegue(当使用调试器时),它似乎不是公共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属性?

我愿意解决以不同方式响应表格视图单元格而解除弹出窗口的问题,但似乎在使用故事板中的segue时,解除弹出窗口的唯一方法是抓住以某种方式对popover控制器的引用,就我所知,唯一的方法是将segue转换为Swift不想让我这样做的popover segue。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

确实是一个奇怪的问题。我在文档中注意到,UIStoryboardPopoverSegue 从任何类继承。这就解释了为什么演员阵容不起作用 - UIStoryboardSegue不是它的超类。所以我只是试图创建一个新对象 - 它看起来很奇怪,但有效:

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

编辑

但是这个控制器不会解雇popover :(

修复方法是在Interface Builder中将segue指定为&#34; Deprecated Segues:Popover&#34;。然后代码将按预期进行

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