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?