prepareForSegue 调用时不发送参数,导致崩溃

Posted

技术标签:

【中文标题】prepareForSegue 调用时不发送参数,导致崩溃【英文标题】:prepareForSegue not sending parameters when called, resulting in a crash 【发布时间】:2014-02-26 05:30:05 【问题描述】:

我的初始视图控制器有两个转场。 push segue 连接到 cell,modal 连接到 + UIBarButtonItem。

当这是我的 prepareForSegue 代码的样子时,一切正常,filePath 通过 push segue 发送,但 filePath 没有通过 modal segue。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"showTimes"]) 
        [[segue destinationViewController] setFilePath:filePath];
    

//    if ([[segue identifier] isEqualToString:@"addEvent"]) 
//        [[segue destinationViewController] setFilePath:filePath];
//     

如果我取消注释第二个 if 语句和 segue 标识符,应用程序将崩溃。 filePath 无处发送。我尝试将 [[segue destinationViewController] setFilePath:filePath]; 从两个 if 语句中移出,以确保执行该行,但这也会使我的应用程序崩溃。

两个 segue 都在属性中设置了正确的标识符。但是,我不确定 Xcode 是否真的意识到设置了正确的标识符,因为当我更改 segue 类型时,这些更改不会在我下次运行应用程序时反映出来。

我不知道该怎么做。我对 Objective-C 比较陌生。

【问题讨论】:

将第二个 if 替换为 else if 我也试过else if,但它给出的结果与注释掉时的结果相同。我尝试将其更改为else,但这似乎也不起作用。 查看下面Jason Coco的回答,如果不行,请分享日志中显示的崩溃原因。 【参考方案1】:

addEvent segue 指向导航控制器,而不是您的视图控制器。相反,获取您的视图控制器并在其上设置文件路径:

[[[segue destinationViewController] topViewController] setFilePath:filePath];

【讨论】:

现在编译器遇到了 setFilePath 的问题:并说“没有可见的 @interface for 'UiViewController' 声明选择器 'setFilePath:'。我导入了目标视图控制器并在每个 . h 文件。这是什么意思? 您必须将 UIViewController 转换为您的特定子类,以便编译器了解 -setFilePath 方法。即[(SubclassName*)[[segue destinationViewController] topViewController] setFilePath:filePath]; 当然,让一个类假定知道destinationViewController 的类型并不是完全松散耦合的……在它们之间使用委托协议会更标准。您可以将目标设置为源的委托,然后调用委托方法将您的文件路径作为参数传入,然后执行转场。 谢谢!!铸造 UIViewController 工作,但我必须阅读更多关于委托,以便我可以实现更标准的协议。

以上是关于prepareForSegue 调用时不发送参数,导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

PrepareForSegue 不在两个 TableView 控制器之间发送数据

在 prepareForSegue 完成之前调用 viewDidLoad

从 UIButton 调用 prepareforSegue?

从发送的电子邮件网络核心身份调用重置密码时不起作用

offline_message_hook:发送离线消息时不被调用

如何从 prepareForSegue 调用“自我”属性:?