0

複数のチェックマークを格納するために 2 つの NSMutable 配列を使用してます。これはviewDidLoadメソッドのコードです...

for (int i=1; i<=[repeatDaysToStore count]; i++) 


{

    BOOL isTheObjectThere = [repeatArray containsObject:[repeatDaysToStore objectAtIndex:(i-1)]];

    if (isTheObjectThere) 
    {

        NSString *into=[repeatArray objectAtIndex:[repeatArray indexOfObject:[repeatDaysToStore objectAtIndex:(i-1)]]];


              [data1 addObject:into];

        NSLog(@"check did load");

    }



}

この後、セルをチェックするためにdata1配列を使用しています...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:                  (NSIndexPath *)indexPath
 {
    static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {

    cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault   reuseIdentifier:CellIdentifier];
 }
 cell.textLabel.text=[repeatArray objectAtIndex:indexPath.row];
tableView.allowsMultipleSelection=YES;
 for (int j=1; j<=[data1 count]; j++) {
     NSLog(@"%d",[[data1 objectAtIndex:(j-1)]intValue]);
       NSLog(@"%d",indexPath.row);
   if([data1 indexOfObject:[data1 objectAtIndex:(j-1)]]==indexPath.row)
     {
  cell.accessoryType = UITableViewCellAccessoryCheckmark;
 } 
 else
  {
       cell.accessoryType = UITableViewCellAccessoryNone;
  }

  }

行の選択を処理するために、このコードを didSelectRowAtIndexPath { NSString *myobj=[repeatArray objectAtIndex:indexPath.row]; で使用しています。

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];    
      if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [repeatDaysToStore removeObject:myobj];
        [data1 removeObject:myobj];


    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [repeatDaysToStore addObject:myobj];
        [data1 addObject:myobj];

    }
[tableView reloadData];
 }

しかし、それは機能していません.誰かが間違っていることを教えてください?

4

2 に答える 2

0

これを理解しやすい方法で機能させるには、それほど複雑でないデータ構造が必要だと思います。

テーブルのデータはオブジェクトの配列である必要があります。各オブジェクトには、少なくとも2つのプロパティが含まれている必要があります。1つは表示する情報でcell.textLabel.textあり、もう1つはBOOLオブジェクトが選択されているかどうかを示すプロパティです。

行を選択したら、BOOLを現在とは逆に設定し、テーブルをリロードします。ではcellForRowAtIndexPath:、セカンダリ配列を経由せずに、要求された行のオブジェクトの現在の設定を使用するだけです。

于 2012-11-15T13:49:54.843 に答える
0

cellForRowAtIndexPath:問題はメソッドの次のコードにあると思います:

for (int j=1; j<=[data1 count]; j++)
{
     NSLog(@"%d",[[data1 objectAtIndex:(j-1)]intValue]);
     NSLog(@"%d",indexPath.row);
   if([data1 indexOfObject:[data1 objectAtIndex:(j-1)]]==indexPath.row)
   {
     cell.accessoryType = UITableViewCellAccessoryCheckmark;
   } 
   else
   {
       cell.accessoryType = UITableViewCellAccessoryNone;
   }
}

コードを削除し、次のように条件を記述します。

if([data1 containsObject:[repeatArray objectAtIndex:indexPath.row])
{
   cell.accessoryType = UITableViewCellAccessoryCheckmark;
} 
else
{
   cell.accessoryType = UITableViewCellAccessoryNone;
}

からも削除[tableView reloadData];しますdidSelectRowAtIndexPath:

于 2012-11-15T13:45:45.157 に答える