DeqeueReusableCellWithIdentifier重叠两个单元格

时间:2016-01-29 02:03:15

标签: ios objective-c uitableview

UITableViewDataSource方法中,我检查是否有数据:

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    if (data.count == 0)
    {
       return 1; //This one cell will be of type NoDataTypeCell
    } else {
       return data.count //These cells will be of type DataTypeCell
    }
}

所以在cellForRowAtIndexPath我用同样的方式检查要使用哪种类型的细胞:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{

    SAFindSuggestedTableViewCell* dataCell = (SAFindSuggestedTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"hasDataIdentifier" forIndexPath:indexPath];

    if (data.count == 0)
    {
        NODataTypeCell* cellNoData = (NODataTypeCell*)[tableView dequeueReusableCellWithIdentifier:@"noDataIdentifier];
        //Setup the noDataCell
        return cellNoData;

    } else {
        return dataCell;
    }
}

这导致了我以前从未见过的东西。正如预期的那样,我的控制器加载数据为空。结果,1个NODataTypeCell出列了。

数据进入后,将重新加载TableView。

numberOfRowsInSection返回data.count

cellForRowAtIndexPath不会返回noDataCell,会返回data.count dataCells

的数量

除了我的tableView仍然有noDataCell。最奇怪的部分?它直接位于tableView中的第一个单元格上。细胞是不可选择的,也使得它背后的细胞无法选择。它没有数据,因为它尚未设置。但它在那里,它不会消失。

我做错了什么?

这是单元格后面的视图调试器透视图。您可以清楚地看到,第一行有两个单元格,第二行只有一个单元格 enter image description here

1 个答案:

答案 0 :(得分:2)

tableView dequeueReusableCellWithIdentifier:将返回一个对象cell并添加到tableView

在上面的代码中:

 SAFindSuggestedTableViewCell* dataCell = (SAFindSuggestedTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"hasDataIdentifier" forIndexPath:indexPath];

if (data.count == 0)
{
    NODataTypeCell* cellNoData = (NODataTypeCell*)[tableView dequeueReusableCellWithIdentifier:@"noDataIdentifier];

如果data = 0。两个单元格已添加到tableView的相同索引路径。这就是bug的原因。

您应该将代码分开,以便在indexPath中返回一个完整的单元格,如:

if (data.count == 0)
{
    NODataTypeCell* cellNoData = (NODataTypeCell*)[tableView dequeueReusableCellWithIdentifier:@"noDataIdentifier];
    //Setup the noDataCell
    return cellNoData;

} else {
    SAFindSuggestedTableViewCell* dataCell = (SAFindSuggestedTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"hasDataIdentifier" forIndexPath:indexPath];
    return dataCell;
}

我看到你评论崩溃。我认为这是因为你的真实代码的逻辑。