从 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)

iOS:让segue等待登录成功

iOS:让segue等待登录成功

iOS开发:控制器间的数据传递

从 NIB 与从代码加载自定义滑块:从代码加载时不存在子视图

如何从其他面板从 JTextField 获取输入