尽管 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];

编辑:

您的numberOfRowsInSectionnumberOfSectionsInTableView 似乎不正确。

试试这个代码:

-(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;

【讨论】:

遗憾地没有解决问题,但是我在更改后收到了警告 - 显然该方法从未使用过。 numberOfSectionsInTableViewnumberOfRowsInSection 实现了吗? 我已经实现了这些,但是像以前一样我错过了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 的保留计数:

UITableView tableView:cellForRowAtIndexPath:没有被调用

nib 项目中的 CellForRowAtIndexPath