我有一个主视图控制器,已在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。有什么想法吗?
答案 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
}