チェックマーク付きのUITableViewCell、チェックマークの複製

これまでのところ、スタックオーバーフローを検索すると、私のような状況が見つかりませんでした。どんな援助も非常に高く評価されています。私は、人物Aにチェックマークを付けると、人物Hも1人も持っていて10人ほど離れていることに気づいています。基本的に10回毎にチェックマークが繰り返されます。

ここに私のコードです:

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

{static NSString *CellIdentifier = @"MyCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

             }

cell.textLabel.text = 

[NSString  stringWithFormat:@"%@ %@", [[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"FirstName"],[[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"LastName"]];
cell.detailTextLabel.text = 

[NSString  stringWithFormat:@"%@", [[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"Address"]];

return cell;

}

私のインデックスパスの行を選択した私はこれがあります:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
cell = [self.tableView cellForRowAtIndexPath: indexPath];

if ([[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"emailSelected"] != @"YES")
{    
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[[myArrayOfAddressBooks objectAtIndex:indexPath.row] setValue:@"YES" forKey:@"emailSelected"];
}
else
{    
    cell.accessoryType = UITableViewCellAccessoryNone;
    [[myArrayOfAddressBooks objectAtIndex:indexPath.row] setValue:@"NO" forKey:@"emailSelected"];
}     
0

1 答え

これは、効率を上げるために UITableView を "リサイクル"する方法と、選択時にセルをマーキングする方法が原因です。

You need to refresh/set the accessoryType value for every cell you process/create within tableView:cellForRowAtIndexPath:. You properly update the state in your myArrayOfAddressBooks data structure, and you just need to use this information in tableView:cellForRowAtIndexPath:

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

{
    static NSString *CellIdentifier = @"MyCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    NSDictionary *info = [myArrayOfAddressBooks objectAtIndex:indexPath.row];

    cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", [info objectForKey:@"FirstName"],[info objectForKey:@"LastName"]];
    cell.detailTextLabel.text = [NSString  stringWithFormat:@"%@", [info objectForKey:@"Address"]];

    cell.accessoryType = ([[info objectForKey:@"emailSelected"] isEqualString:@"YES"]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

    return cell;
}

また、状態を @ "Yes" または @ "No" という文字列として保存するのが良い理由がない限り、それらを [NSNumber numberWithBool: YES] または [NSNumber numberWithBool:NO] ?これにより、 isEqualToString:を常に使用するのではなく、比較を行う場合にロジックが簡略化されます。

例えば

    cell.accessoryType = ([[info objectForKey:@"emailSelected"] boolValue]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
6
追加された