为啥我的 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:]