尽管 cellForRowAtIndexPath 返回有效单元格,但 UITableView 崩溃
Posted
技术标签:
【中文标题】尽管 cellForRowAtIndexPath 返回有效单元格,但 UITableView 崩溃【英文标题】:UITableView crash despite cellForRowAtIndexPath returning valid cell 【发布时间】:2016-08-29 08:59:51 【问题描述】:我在更改视图控制器时遇到了一些崩溃问题 - 基本上我有一个 VC 从用户那里获取数据进行搜索 - 然后它会打开一个带有搜索结果的新 VC,显示在 UITableView (不使用UITableViewController
,只是在常规UIViewController
中使用TableView)
崩溃日志:
2016-08-29 20:48:03.950 MyApp[2596:60877] *** 断言失败 -[SearchResultsTable _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim /UIKit-3512.60.7/UITableView.m:7971
2016-08-29 20:48:03.961 MyApp[2596:60877] 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UITableView (; layer = ; contentOffset: 0, 0; contentSize: 375 , 1128>) 未能从其 dataSource (; layer = ; contentOffset: 0, 0; contentSize: 0, 0>)' *** 首先抛出调用栈:
我了解到此问题是由于未在您的 cellForRowAtIndexPath
函数中返回单元格引起的,但我确信我的实现将成功返回一个单元格。 (我在别处测试了函数的代码,cell
实际上确实有一个值,并且不是 nil。)
代码:
@property searchResultCell * cell;
-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath
_cell = [self dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
if (_cell == nil)
_cell = [[searchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[[_cell txtDate] setText:@"test"];
return _cell;
在设置了一些断点后,这部分代码似乎从未执行过,尽管 UITableView
类、委托和数据源设置正确。
搜索结果 VC 的 viewDidLoad([self SpecifiedSerial]
是在 segue 发生之前预先设置的。它是一个 NSString*
):
- (void)viewDidLoad
[super viewDidLoad];
_SearchResultsTableDelegate = [[searchResultsTable alloc] init:[self specifiedSerial]];
[[self SearchResultsTable] setDelegate:_SearchResultsTableDelegate];
[[self SearchResultsTable] setDataSource:_SearchResultsTableDelegate];
声明:
@property (weak, nonatomic) IBOutlet UITableView *SearchResultsTable;
@property searchResultsTable * SearchResultsTableDelegate;
如果有人能在这里指出正确的方向,将不胜感激!
【问题讨论】:
你能显示调用它的时间和地点吗? 试试这个 UITableViewCell *_cell = [yourTableView dequeueReusableCellWithIdentifier:@"cell"]; if (_cell == nil) _cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 显示更多代码,为什么delegate没有将自己设置为table delegate? 【参考方案1】:使用此代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
_cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
代替:
-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath
_cell = [self dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
编辑:
您的numberOfRowsInSection
和numberOfSectionsInTableView
似乎不正确。
试试这个代码:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [[self searchedTrainSightings] count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
_cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];
if (_cell == nil)
_cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[[_cell textLabel] setText:@"test"];
return _cell;
【讨论】:
遗憾地没有解决问题,但是我在更改后收到了警告 - 显然该方法从未使用过。numberOfSectionsInTableView
和 numberOfRowsInSection
实现了吗?
我已经实现了这些,但是像以前一样我错过了tableView:
。当我添加它时,它会引发错误Duplicate declaration of method
。可以发布到 Github 的链接吗?
是的!这样会更有帮助。
我让它与您在上面发布的代码一起工作,再加上一点游戏。感谢您的帮助!【参考方案2】:
可能的原因是您从 cellForRowAtIndexPath
方法返回 nil 并且未能使可重复使用的单元格出列。
使用代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
searchResultCell *cell;
cell = (searchResultCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
cell = [[searchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[[_cell txtDate] setText:@"test"];
return cell;
只需配置您的单元格,选择您的自定义单元格,使用情节提要提供cell
标识符参见图片。
希望对你有帮助。
【讨论】:
【参考方案3】:我严重怀疑您使用的委托方法。我见过这个版本的cellForRowAtIndexPath
方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
试试这个
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
_cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (_cell == nil)
_cell = [[searchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[[_cell txtDate] setText:@"test"];
return _cell;
【讨论】:
以上是关于尽管 cellForRowAtIndexPath 返回有效单元格,但 UITableView 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
cellForRowAtIndexPath:XCode 模板是不是正确?
从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?
cellForRowAtIndexPath:reloaddata 未调用
tableView:cellForRowAtIndexPath 的保留计数: