0

私はこれを少し理解しようとしています。独自の xib ファイルにカスタム セルを作成します。私のView Controllerでは、セクションを含むTable View Controllerをセットアップしました。テーブル ビューに取り込まれるデータは、私が持っているいくつかのコア データからのフェッチ リクエスト コントローラーに基づいています。cellForRowAtIndexPath 関数でカスタム セルを設定します。この関数内の各セルにラベルを作成し、ラベルに管理対象オブジェクトのデータを入力します。最初に実行したときは、すべて問題ないようです。ただし、上下にスクロールしようとすると、新しいセルが再利用され、ラベルのデータが間違ったセルに配置されます。これは細胞の再利用に関係しているのを見たり聞いたりしたことがあります。ただし、この問題を修正する例はあまり見られません。以下は、私の cellForRowAtIndexPath 関数にあるコードの一部です。他に入力が必要な場合はお知らせください。助けてくれてありがとう。

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

    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"CustomCell"];

    /* do this to get unique value per cell due to sections. */
    NSInteger indexForCell = indexPath.section * 1000 + indexPath.row + 1;

    NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];



    NSString *lastSession = nil;
    UILabel *lastSessionLabel = nil;
    if(cell == nil) {

        lastSession = [managedObject valueForKey:@"last_session"];

        [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" 
                                                   bundle:[NSBundle mainBundle]] 
             forCellReuseIdentifier:@"CustomCell"];

        self.tableView.backgroundColor = [UIColor clearColor];
        cell = [aTableView dequeueReusableCellWithIdentifier:@"CustomCell"];

        lastSessionLabel = [[UILabel alloc]initWithFrame:CGRectMake(410,55, 89, 35)];
        lastSessionLabel.textAlignment = UITextAlignmentLeft;
        lastSessionLabel.tag = indexForCell;
        lastSessionLabel.font = [UIFont systemFontOfSize:17];
        lastSessionLabel.highlighted = NO;
        lastSessionLabel.backgroundColor = [UIColor clearColor];

        cell.contentView.tag = indexForCell;
        [cell.contentView addSubview:lastSessionLabel];
    } else {
        lastSessionLabel = (UILabel *)[cell viewWithTag:indexForCell];
    }

        if (lastSession && lastSession.length) {        
            lastSessionLabel.text = lastSession;
        } 


    cell.textLabel.text = [NSString stringWithFormat:@"%@%@%@%@", @"Dr. ",
                           [managedObject valueForKey:@"first_name"], 
                           @" " , 
                           [managedObject valueForKey:@"last_name"]];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.editingAccessoryType = UITableViewCellAccessoryNone;


    return cell;
}

** 改訂されたコード **

以下はコードの変更点です。viewDidLoad では次のようになります。

 - (void)viewDidLoad
{
    [super viewDidLoad];
   [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" 
                                           bundle:[NSBundle mainBundle]] 
         forCellReuseIdentifier:@"CustomCell"];

       self.tableView.backgroundColor = [UIColor clearColor];
  }     

 in -(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath {
  UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    NSInteger indexForCell = indexPath.section * 1000 + indexPath.row + 1;
    NSLog(@"index for cell: %d",indexForCell);

    NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];


    NSString *lastSession = [managedObject valueForKey:@"last_session"];
 UILabel *lastSessionLabel = nil;
    if(cell == nil) {
        NSLog(@"Cell is nil! %@", [managedObject valueForKey:@"first_name"]);

         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];


        self.tableView.backgroundColor = [UIColor clearColor];
   }    
        lastSessionLabel = [[UILabel alloc]initWithFrame:CGRectMake(410,55, 89, 35)];
        lastSessionLabel.textAlignment = UITextAlignmentLeft;
        lastSessionLabel.tag = indexForCell;
        lastSessionLabel.font = [UIFont systemFontOfSize:17];
        lastSessionLabel.highlighted = NO;
        lastSessionLabel.backgroundColor = [UIColor clearColor];


        [cell.contentView addSubview:lastSessionLabel];
        /* Appropriate verbiage for nil last session. */
       if (lastSession && lastSession.length) {        
            lastSessionLabel.text = lastSession;
        }   
 return cell;  
}

 I am still having issues again with the label cell text changing when I scroll for different cells. I read some where about maybe having to use the prepareForReuse function for this.
4

1 に答える 1

1

lastSession新しいセルを作成するときにのみ取得しています。if(cell == nil)この行をステートメントの前に置いてみてください。

lastSession = [managedObject valueForKey:@"last_session"];

すなわちこれ:

NSString *lastSession = [managedObject valueForKey:@"last_session"];

これの代わりに:

NSString *lastSession = nil;

アップデート

また、2 つのビューに同じタグを設定しています。

lastSessionLabel.tag = indexForCell;
...
cell.contentView.tag = indexForCell;

コードサンプルに基づいて、最初の行のみを使用する必要があります。つまり、lastSessionLabel

2回目の更新

また、新しいセルが必要になるたびに呼び出すのではなくregisterNib:、ビューのライフサイクル (例: ) で 1 回だけ呼び出す必要があります。さらに、を使用する代わりにviewDidLoad、新しいセルを作成する必要があります。例えばcell == nildequeueReusableCellWithIdentifier:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];
于 2012-04-18T23:03:23.880 に答える