我有一个主视图 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/