为啥我的 prepareForSegue 崩溃

Posted

技术标签:

【中文标题】为啥我的 prepareForSegue 崩溃【英文标题】:why does my prepareForSegue Crash为什么我的 prepareForSegue 崩溃 【发布时间】:2015-05-04 13:31:34 【问题描述】:

我试图通过导航控制器通过 segue 传递 IndexPath,但它在线崩溃:

view.selectedAccount = self.selectedAccountRow;

谢谢

-(IBAction)changeButtonPressed:(id)sender 

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.accountTableView];
NSIndexPath *indexPath = [self.accountTableView indexPathForRowAtPoint:buttonPosition]
self.indexPath = indexPath;
NSLog(@"%ld",(long)indexPath.row);

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

    [super prepareForSegue:segue sender:sender];
    ViewController2 *view = [segue destinationViewController];
    view.selectedAccount = self.indexPath;

在这里回答:Set NSString Object, prepareForSegue through UINavigationController

【问题讨论】:

日志说什么?为什么会崩溃?顺便说一句:我认为您不必在 prepareforsegue 中调用 super 的实现! "无法识别的选择器发送到实例" 好的。听起来您的 ViewController2 类没有名为 selectedAccount 的属性。 如果您需要任何帮助,我们需要更多信息,首先self.selectedAccountRow 是在哪里定义的?其次,ViewController2 是否有一个名为 selectedAccount 的属性? ViewController2.h 有“@property (nonatomic) NSIndexPath *selectedAccount;” 【参考方案1】:

我看到很多错误:

self.selectedAccountRow 永远不会被定义,改为:

-(IBAction)changeButtonPressed:(id)sender 
  CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.accountTableView];
  NSIndexPath *indexPath = [self.accountTableView indexPathForRowAtPoint:buttonPosition]
  self.selectedAccountRow = indexPath;

使用 [segue destinationViewController] 时,您需要确保您指定的类是正确的:

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

  ViewController2 *view = (ViewController2*)[segue destinationViewController];
  view.selectedAccount = self.selectedAccountRow;

没有必要声明 as strong,因为它是默认的,但它是推荐的,因为它更易于阅读,并且是一种很好的编码习惯。

@property (strong, nonatomic) NSIndexPath *selectedAccount;

你需要更好地命名你的类和属性,如果你声明一个viewController子类,名字应该是自我解释的,也许你可以将它命名为detailViewController而不是viewController2

此外,您应该考虑为您的课程使用 2-3 个字母的前缀,请在此处阅读良好的 obj-c 实践: Objective-C Good practices

【讨论】:

我已经一起破解了我的代码,我在一家公司工作,所以不能只是复制代码。但它仍然崩溃使用你的建议 我有一个错误,我刚刚编辑了我的答案,在第二个代码 sn-p 中我已经将我的代码更改为 view.selectedAccount = self.selectedAccountRow; 如果这不能解决您的错误,请给我们提供更多详细信息?或您遇到的新错误。 我已经这样做了,仍然得到“无法识别的选择器发送到实例” 你在哪里打电话给[self performSegueWithIdentifier:sender:]?来自IB? 内部 -(IBAction)changeButtonPressed:(id)sender【参考方案2】:

右键单击您在 IB 中的视图并删除有黄色警告标志的实例。运行,一切都应该工作。

【讨论】:

以上是关于为啥我的 prepareForSegue 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

PrepareForSegue 方法使应用程序 iOS 崩溃

使用导航控制器在“prepareForSegue”中设置数据

-[NSObject(NSObject) doesNotRecognizeSelector:] 调用时崩溃 -[ViewController prepareForSegue:sender:]

iOS App 在 segue 崩溃(断点发生在 func prepareForSegue)

为啥我的变量值在 Swift 中恢复?

prepareForSegue 出错“”在展开可选值时意外发现 nil“”