2

みなさん、こんにちは。 indexPath.row に関連するタグを持つカスタム ボタンを追加しようとしています。テーブルビューに新しい行を挿入しなければ、タグの値を正しく表示できます。しかし、新しい行を挿入すると、挿入された行が 0 から 9 の範囲にない場合、新しい行のタグ値が正しくありません (iphone 5 はそれまで表示できます)。iPhone では、下にスクロールして表示する必要があります。


ただし、同じコードを使用すると、iPad でタグ値を正しく取得できます。すべての行を表示するために iPad のテーブル ビューを下にスクロールする必要はありません。原因と解決方法を知りたいです。

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

    static NSString *CellIdentifier = @"dialoguesTableCell";
    dialoguesCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[dialoguesCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier];

    }

    UIButton *yourButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [yourButton setImage:[UIImage imageNamed:@"1StarBlank.png"]     forState:UIControlStateNormal];
    [yourButton setTitle:@"Button" forState:UIControlStateNormal];
    [yourButton addTarget:self action:@selector(buttonSelected:)   forControlEvents:UIControlEventTouchUpInside];
    yourButton.tag=indexPath.row;
    yourButton.frame = CGRectMake(5, 10, 40, 25);
    [cell addSubview:yourButton];
    return cell;


}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath    *)indexPath
{
   NSIndexPath *indexPathstoinsert = [NSIndexPath indexPathForRow:indexPath.row+1     inSection:section];
   NSArray *indexPathsToInsertArray = [NSArray arrayWithObject:indexPathstoinsert];
   [[self mainTableView] insertRowsAtIndexPaths:indexPathsToInsertArray withRowAnimation:UITableViewRowAnimationRight];

}
4

1 に答える 1

1

下にスクロールするとUITableViewがセルを再利用し、最初のセルが表示されなくなり、再利用されるため、これは正しく機能しません。

テーブルが..「小さい」場合は、セルを再利用しないことで回避できますが、テーブルが
ほんの数エントリではなく、本当に方法を変更したい大量のデータである場合

次のボタンにタグを割り当てます。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

例えば

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIButton *b = nil;
    for(UIView *v in cell.subviews) {
        if([v isKindOfClass:[UIButton class]]) {
            b = (UIButton*)v;
            break;
        }
    }

    b.tag = indePath.row;
}

コメントで別の問題について言及しました。ボタンはdidSelectRowメソッドで非表示になり、スクロール後に他のセルからも消えます。同じ問題: セル オブジェクトはテーブルビューによって再利用されます。再利用可能なセルに状態を保存しないでください!

代わりに、状態を記憶する「モデル」ツリーまたは配列を用意します: text、image、tag、hide:yes/no

NSArray *myTableContents

 NSMutableDictionary *d1 = [@{@"text:@"bla", @"hidden":@NO} mutableCopy];
 NSMutableDictionary *d2 = [@{@"text:@"bloo", @"hidden":@NO} mutableCopy];
 NSMutableDictionary *d3 = [@{@"text:@"foo", @"hidden":@NO} mutableCopy];
 myTableContents = @[d1,d2,d3];

THEN 常に numberOfRows と viewForRow でその配列を使用し、didSelectEntry でそれを変更します

于 2012-12-23T09:04:38.567 に答える