2

XIB ファイルから読み込んでいる UITableViewCells がいくつかあります。セルが消えたときに [UITableView reloadRowsAtIndexPaths:withRowAnimation:] メソッドを呼び出すまで、すべてが素晴らしいです。[UITableView reloadData] を呼び出すと、すべての検索結果が読み込まれます。ビューのオンとオフでセルをスクロールすると、セルも再表示されます。変。

[UITableView reloadRowsAtIndexPaths:withRowAnimation:] を呼び出すと、UITableView はキャッシュされたセルを再利用しようとせず、cell = [tableViewCells objectAtIndex:cellId]; で新しいセルを取得しようとすることにも気付きました。

これが私のコードです:

- (void)viewDidLoad
{
    ...
    // the objects from the XIB files are loaded onto an NSArray instance variable at viewDidLoad
    tableViewCells = [[NSBundle mainBundle] loadNibNamed:@"ProfileTableViewCell" owner:nil options:nil];
    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    int cellId = /* some logic to get the correct cellID */
    NSString *CellIdentifier = [NSString stringWithFormat:@"ProfileTableViewCell_%d", cellId];
    ProfileTableViewCell *cell = (ProfileTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
        cell = [tableViewCells objectAtIndex:cellId];
        // additional work to setup subviews for the cell
        [cell prepareSubviews];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }
}

念のため、[ProfileTableViewCell prepareSubviews] で行っていることをいくつか示します。

- (void)prepareSubviews
{
    ...
    [self.containerView.layer setCornerRadius:3];
    [self.containerView.layer setBorderColor:UIColorFromRGB(0xCDCDCD).CGColor];
    [self.containerView.layer setBorderWidth:2.0];
    [self.containerView.layer setMasksToBounds:YES];
    [self.containerView.layer setShouldRasterize:NO];
    [self.containerView.layer setRasterizationScale:[UIScreen mainScreen].scale];
    ...
}

私を助けてくれる素晴らしい人に前もって感謝します。

4

2 に答える 2

1

これがあなたの問題かどうかはわかりませんが、細胞を取得する方法は通常の方法ではありません. それぞれの種類のセルを独自の nib で作成し (一意の識別子を使用)、その nib を registerNib:forCellReuseIdentifier: で登録する必要があります。cellForRowAtIndexPath では、インデックス パスに基づいて必要なセルをデキューするだけで、if (cell == nil) 句には何も入れないでください。この方法では呼び出されないためです。

于 2013-08-13T16:26:56.083 に答える
0

reloadRowsAtIndexPaths: は、静的セルの高さのみを変更する必要がある場合は機能しません。

ただ電話してみてください

[tableView beginUpdates];
[tableView endUpdates];

ドキュメントが言うように:

このメソッドの後に endUpdates メソッドを使用して、セルをリロードせずに行の高さの変化をアニメーション化することもできます。

于 2016-03-25T16:56:54.387 に答える