PrepareForSegue 方法使应用程序 iOS 崩溃

Posted

技术标签:

【中文标题】PrepareForSegue 方法使应用程序 iOS 崩溃【英文标题】:PrepareForSegue method crashes app iOS 【发布时间】:2016-02-18 13:02:07 【问题描述】:

我有一个UIButton,当我单击它时,它会推送另一个视图控制器,但它会在此处崩溃 textViewController.message = self.selectedMessage; 带有错误设置消息。

这是我的按钮,其中包含崩溃的代码和方法:

- (IBAction)image:(id)sender 

   [self performSegueWithIdentifier:@"image" sender:self];


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"showLogin"]) 
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
     else 
        [segue.identifier isEqualToString:@"showImage"];
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
        ImageViewController *imageViewController = (ImageViewController *)segue.destinationViewController;
        imageViewController.message = self.selectedMessage;
    

如何修复PrepareForSegue 方法,以便在按下按钮时可以转到下一个VC。我设置了异常断点,它在imageViewController.message = self.selectedMessage; 处崩溃。当我评论这条线时,一切正常。

【问题讨论】:

你确定destinationViewController 真的是ImageViewController 类型而不是UINavigationController? 你怎么能确定?如果它崩溃并且找不到消息属性的选择器,那么它不是 ImageViewController。 请参阅下面的答案以进行修复 发布完整的崩溃日志。 如果标识符是image 为什么要与showImage 比较。检查你的 else 结构不好。应该是else if ([segue.identifier isEqualToString:@"image"])。请添加完整的崩溃日志 【参考方案1】:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"showLogin"]) 
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
     else 
        ImageViewController *imageViewController = (ImageViewController *)segue.destinationViewController;
        [imageViewController setHidesBottomBarWhenPushed:YES];
        imageViewController.message = self.selectedMessage;
    

试试这个。

【讨论】:

不工作这是错误 [ViewController setMessage:]: unrecognized selector sent to instance 0x155f95e60 显示 Imageviewcontroller 的 message 属性。 . . .错误在那里@Joey121 删除一条无用的行如何防止它崩溃?如果找不到选择器,则destinationViewController 不是 ImageViewController。 请检查您创建的故事板中的segue。 . .it 没有指向 imageviewcontroller。或者您的标识符未设置为 segue 到 imageviewcontroller 查看我的答案以进行修复【参考方案2】:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"showLogin"]) 
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
     else 
        [segue.identifier isEqualToString:@"showImage"];
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
        ImageViewController *imageViewController = (ImageViewController *)segue.destinationViewController;
        imageViewController.message = self.selectedMessage;
    

必须改成这个才能正常工作

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"showLogin"]) 
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
     else if ([segue.identifier isEqualToString:@"showImage"])
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
        ImageViewController *imageViewController = (ImageViewController *)segue.destinationViewController;
        imageViewController.message = self.selectedMessage;
    

【讨论】:

以上是关于PrepareForSegue 方法使应用程序 iOS 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

prepareForSegue 是在视图控制器之间传递值的正确方法吗

使用 prepareForSegue 设置方法值

如何在 iOS 中的 prepareForSegue 之前执行按钮按下操作?

在prepareForSegue方法中防止segue?

UITableViewControllers 上的 prepareforSegue 方法

对 UITableView 使用 didSelectRowAtIndexPath 或 prepareForSegue 方法?