从 prepareForSegue:sender 设置 UITableView 委托和数据源时出错:
Posted
技术标签:
【中文标题】从 prepareForSegue:sender 设置 UITableView 委托和数据源时出错:【英文标题】:Error Setting UITableView Delegate and DataSource from prepareForSegue:sender: 【发布时间】:2012-01-08 23:36:07 【问题描述】:我正在使用prepareForSeque:sender:
动态设置UITableView
的delegate 和dataSource 属性,然后再将其推入导航堆栈。委托方法永远不会被调用,Xcode 返回下面的错误。不幸的是,Xcode 并没有给我太多的堆栈跟踪信息,唯一表明什么对象被用作数据源的是UIViewControllerWrapperView
的一个实例,我认为它可能是由故事板库生成的。有任何想法吗?这不可能吗?
错误:
* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[UIViewControllerWrapperView tableView:numberOfRowsInSection:]: 无法识别的选择器发送到 实例 0x7f49370'
这是我的代码:
/**
* Handle the various segues
*
* @author Jesse Bunch
**/
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
// Get the selected cell
NSIndexPath *selectedIndexPath = self.tableView.indexPathForSelectedRow;
ReportTableViewCell *cell = (ReportTableViewCell *)[self.tableView cellForRowAtIndexPath:selectedIndexPath];
// Instantiate the selected report's context
// TODO: Insert error handling here
Class reportClass = NSClassFromString([cell.reportInfo objectForKey:@"ReportClass"]);
BaseReportContext *reportContext = [[reportClass alloc] init];
reportContext.delegate = self;
// Get the destination options controller
ReportOptionsTableViewController *optionsController = (ReportOptionsTableViewController *)segue.destinationViewController;
// Let the report context be the delegate of the options controller
// The report context should contain all the information needed
// to display the necessary report customization options
optionsController.tableView.delegate = reportContext;
optionsController.tableView.dataSource = reportContext;
【问题讨论】:
请您做一个简单的 isKindOfClass:[BaseReportContext class] 检查并记录 [cell.reportInfo objectForKey:@"ReportClass"] 的否定结果吗? 我从控制台添加了一个屏幕截图以显示类型符合预期... BaseReportContext是否实现了UITableViewDataSource协议? 您可以通过设置异常断点来获取异常的堆栈跟踪。 ***.com/questions/4961770/… @Jesse Bunch,谢谢,看起来不错。然后,您是否会尝试以更可靠的方式保留委托/ds 对象(比如将其保留在 var/property 数组/字典中)?我相信委托不应该被对象保留,可能会发生所有reportContext都被释放的情况。至少日志完全符合内存管理问题的情况,我相信你自己也注意到了。 【参考方案1】:然后您会尝试以更可靠的方式保留委托/ds 对象(比如将其保留在 var/property 数组/字典中)吗?我相信委托不应该被对象保留,可能会发生所有reportContext都被释放的情况。至少日志完全符合内存管理问题的情况,我相信你自己也注意到了。
【讨论】:
以上是关于从 prepareForSegue:sender 设置 UITableView 委托和数据源时出错:的主要内容,如果未能解决你的问题,请参考以下文章
prepareForSegue 不适用于自定义 segue (swift)