0

したがって、ビルダーを介して定義され、nib を介して読み込まれるカスタム テーブル セルがあり (そして、その idexPath のプロパティがあります)、2 つのボタンがあります。これらのボタンの状態が動的に変更されたテーブルを表示したい。IE 1 番目のセル - 両方が有効、2 番目のセル - 両方のボタンが無効、3 番目 - 1 番目の btn が有効、2 番目の btn が無効など。
ここで、1 つの再利用識別子を使用すると、すべてのセルが同じように見えますが、これは望ましくありません。すべてのセルに独自のビューが必要です。これは、すべてのセルに一意の再利用 ID を意味します。
しかし、どうやってこれに到達するのですか?一意の cellId を作成する場合

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

これは文字列になるので、オブジェクトの意味で同じ文字列を作成できませんでした。同じテキストで文字列を作成できましたが、これは別のオブジェクトになるため、reuseId を介してそのような cellId で以前に作成したセルを再度取得できませんでした。したがって、1つのセルのボタンの状態を変更して更新することはできません

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationNone];

しかし、意志だけが機能し[tableView reloadData];ます。

4

1 に答える 1

1

initWithStyle:reuseIdentifier:で最初にセルを作成するときに、セルのボタンの状態を設定しているだけだと思います。これは間違ったやり方です。セルが再利用されているかどうかにかかわらず、cellForRowAtIndexPathへのすべての呼び出しでセルの状態を設定する必要があります。あなたの場合、各セルに同じ UI (2 つのボタン) がある場合、それらはすべて 1 つの reuseIdentifier を共有する必要があります。UITableViewCell オブジェクトではなく、データソースがセルの状態を維持する必要があります。

これは次の違いです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     myCustomCell *cell = (myCustomCell *)[myTable dequeueReusableCellWithIdentifier:@"myCellIdentifier"];
     if (cell == nil) {
       // Load cell from nib here and set the cell's button states based on indexPath
     }
    return cell;
}

この:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     myCustomCell *cell = (myCustomCell *)[myTable dequeueReusableCellWithIdentifier:@"myCellIdentifier"];
     if (cell == nil) {
       // Load cell from nib here
     }
    // set the cell's button states based on indexPath here
    return cell;
}
于 2012-07-03T23:09:38.023 に答える