4

UITableViewCellをサブクラス化して、カスタムの外観を追加しました。MYTableViewCellのinitレベルで、4つのサブビュー(UIImageViewと3つのUILabel)を追加しました。4つのサブビューすべてに、異なるタグが割り当てられています。

cellForRowAtIndexPathメソッド内で、最初に使用できなかった場合は新しいセルを作成するか、使用可能なセルを再利用して適切なテキストをUIラベルに割り当てます。

私が抱えている問題は、超高速でスクロールしようとするとデータが台無しになることですが、上下にゆっくりスクロールするとすべてが正常に機能します。

何かご意見は??

以下はコードです:

- (MyTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"itemListTableViewCell";
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

DisplayableEntity *displayableEntity = [self.fetchedResultsController objectAtIndexPath:indexPath];

if( ! cell ) {
    cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    [self tableView:tableView appearanceForCell:cell withEntity:displayableEntity];
} else {

    UIImageView *imageView = (UIImageView *) [cell viewWithTag:IMAGEVIEW_TAG];
    imageView.image = [UIImage imageNamed:displayableEntity.displayImageName];

    UILabel *titleLabel = (UILabel *) [cell viewWithTag:TITLEVIEW_TAG];
    titleLabel.text = displayableEntity.entityName;

    UILabel *itemDescription = (UILabel *) [cell viewWithTag:DESCRIPTION_TAG];
    itemDescription.text = displayableEntity.entityDesctiption;
  }
}

// some code removed to make it brief
- (void)tableView:(UITableView *)tableView appearanceForCell:(MyTableViewCell *)cell withEntity:(DisplayableEntity *)entity {

    // cell image view
    UIImageView *cellImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[entity displayImageName]]];
    [cellImageView setTag:IMAGEVIEW_TAG];
    [cell addSubview:cellImageView];

    // adding entity name label    
    UILabel *itemTitleName = [self itemTitleNameLabelWithFrame:itemNameLabelRect itemName:[entity entityName]];
    [itemTitleName setTag:TITLEVIEW_TAG];
    [cell addSubview:itemTitleName];

    // adding 'assigned to' label right under the item name label
    UILabel *itemDescriptionLabel = [self itemDescriptionLabelWithFrame:descriptionLabelFrame itemDescription:[entity entityDesctiption]];
    [itemDescriptionLabel setTag:DESCRIPTION_TAG];
    [cell addSubview:itemDescriptionLabel];
}
4

1 に答える 1

3

tableView:cellForRowAtIndexPath:ロジックに問題があります。次のようになります。

  1. セルをデキューします
  2. セルをデキューできない場合-新しいセルを作成します
  3. すべてのセルプロパティを設定する

私はこのようなものを意味します:

- (MyTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"itemListTableViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    } // <-- Note there is no else, we should reset properties in both cases

    NSManagedObject *managedObject = [_fetchedResultsController objectAtIndexPath:indexPath];

    cell.textLabel.text = [managedObject valueForKey:@"text"];
    cell.imageView.image = [managedObject valueForKey:@"image"];

    return cell;
}
于 2012-09-03T23:40:52.820 に答える