在 Swift 2 中通过“prepareForSegue”传递数据
Posted
技术标签:
【中文标题】在 Swift 2 中通过“prepareForSegue”传递数据【英文标题】:Pass data via 'prepareForSegue' in Swift 2 【发布时间】:2016-03-04 09:20:37 【问题描述】:试图将字符串从一个视图控制器传递到另一个视图控制器(MoreDetailViewController)
出现这个错误:
Interface Builder 文件中的未知类 MoreDetailViewController。 无法将“UIViewController”(0x10f4ae308)类型的值转换为“ParseStarterProject_Swift.MoreDetailViewController”(0x10d512060)。 (lldb)
很抱歉,这很明显,但我最近才开始编码。谢谢! :)
代码:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if (segue.identifier == "showDetail")
let detailController : MoreDetailViewController = segue.destinationViewController as! MoreDetailViewController
detailController.receivedId = selectedId
【问题讨论】:
您是否在 Storyboard 中将UIViewController
的自定义类设置为MoreDetailViewController
?
【参考方案1】:
您的第二个视图控制器是否在 Interface Builder 中正确设置为 MoreDetailViewController
?
您可以轻松检查:打开您的 .xib 或 .storyboard 文件,选择您的第二个视图控制器,然后在 Identity Inspector(右侧面板,第三个选项卡)上输入您的类名。
【讨论】:
【参考方案2】:错误只是说segue目标视图控制器不是MoreDetailViewController
。您也不应该强制打开它,在这种情况下,如果对象不正确,它将崩溃。
if segue.identifier == "showDetail"
if let vc = segue.destinationViewController as? MoreDetailViewController
vc.receivedId = selectedId
编辑
没有看到之前的答案是完全相同的代码。对此感到抱歉。
【讨论】:
正如另一条评论中提到的,segue 要么总是工作(如果参数设置正确),要么从不工作,这肯定不是有意的。所以在这种情况下可选绑定是没有意义的。 当然,对于 segue 本身来说是这样,但不是为了防止出现问题时崩溃。我在上面的文字中清楚地说明了 OP 问题的原因 - 就像其他人在线程中一样:)【参考方案3】:试试这个:
if segue.identifier == "showDetail"
if let detailController = segue.destinationViewController as? MoreDetailViewController
detailController.receivedId = selectedId
注意:不要忘记将 viewcontroller 类设置为 MoreDetailViewController
【讨论】:
由于控制器是在 Interface Builder 中设计的,如果标识符和自定义类设置正确,它将永远不会是可选的。 安全总比抱歉好。此外,假设您在情节提要中进行了更改。您不会完全测试整个应用程序,然后将应用程序推送到应用商店。突然之间,您将遇到大量提供很少信息的崩溃,而不是一个无法正常工作的按钮。在我看来,让应用程序以错误的方式运行而不是崩溃要好得多。 崩溃或故障的用户体验——segue 永远不会被执行——实际上并没有什么区别。可选绑定的概念不是为了支持开发者的粗心@ClockWise以上是关于在 Swift 2 中通过“prepareForSegue”传递数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 2 中通过按一下按钮播放 m4a 文件?
在 Swift2 中通过 HTTP2 与 APNS 服务器通信
如何在 Swift 中通过 MR 的 id 从 coredata 中选择一条记录