0

我知道这里有很多与此主题相关的问题,但我找不到任何与我的问题相匹配的问题。我有UITableViewCell名为“CustomTableViewCell”的子类。

下面提到的代码工作正常,但是,我的单元格中有复选标记,我想停止可重用性,因为单元格的最大数量不会超过 25,因此它不会影响性能,我想经过多次搜索,我发现我必须删除 tableViewdequeueReusableCellWithIdentifier方法或只是将标识符更改为 nil,但不幸的是,当我这样做时,我得到了空单元格,并且我的应用程序崩溃了我在这里缺少什么?

这很好用,但它重用了单元格。

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

    static NSString *CellIdentifier = @"CustomCell";

    CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    ...
    ...
    ...
    ...

    return cell;
}

相反,此代码崩溃:

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

    static NSString *CellIdentifier = @"CustomCell";

    CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    ...
    ...
    return cell;
}
4

3 回答 3

2

实施 prepareForReuse

我强烈建议您使用重用模式,在我看来,不这样做只是不好的做法。我想您避免使用重用模式的真正原因是您在自定义单元格中看到“旧”状态,当它们被重用时。

为避免这种情况,您应该在自定义单元格中实现/覆盖 prepareForReuse 方法,在此方法中,您将所有自定义属性设置为默认状态。

在 cellForRowAtIndexPath 中,您只需重用单元格并将自定义属性设置为它们的值。

- (void)prepareForReuse() {
    [super prepareForReuse];

    //Set your custom properties to their default state
    self.custom1 = ...;
    self.custom2 = ...;
}
于 2013-05-14T05:37:28.377 回答
0

You can do something like this,

1) @property (nonatomic, strong) NSMutableDictionary *cellArray;

2)in viewDidLoad,

self.cellArray = [[NSMutableDictionary alloc] init];

3)

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

    static NSString *CellIdentifier = @"CustomCell";

    CustomTableViewCell *cell = nil;
    id c = [self.cellArray objectForKey:[NSNumber numberWithInt:indexPath.row]];
    if(!c){
        cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    cell.textLabel.text = @"init part goes here";
    ...
    ...
    ...
    ...
        [self.cellArray setObject:cell forKey:[NSNumber numberWithInt:indexPath.row]];
    }else{
        cell = (CustomTableViewCell *) c;
    }

    return cell;
}
于 2013-05-14T03:29:10.763 回答
0

Remove the who chunk of code which which deals with reusing cell. No need to check if cell is nil. Everytime, create a new instance of UITableViewCell.

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

    CustomTableViewCell *cell = [[CustomTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@""];

    //do a bunch of stuff to fill the cell.

    return cell;
}

This piece of code will create a new cell everytime.

于 2013-05-14T03:20:42.230 回答