如何存储,检索检查或取消选中的单元格

时间:2014-04-28 06:36:57

标签: ios objective-c

我正在尝试保存我放在单元格上的复选标记然后检索它。我在该部分有11个单元格。

我尝试使用此link作为指南,但它确实有用。但我想只需要保存一个复选标记而不是很多。

我还希望默认为所有单元格设置复选标记。我将如何实现这一目标

我的代码:

- (NSString *)getKeyForIndex:(int)index{
   return [NSString stringWithFormat:@"KEY%d",index];
}

- (BOOL) getCheckedForIndex:(int)index {
if([[[NSUserDefaults standardUserDefaults] valueForKey:[self getKeyForIndex:index]] boolValue]==YES) {
 return YES;
}
else
{
  return NO;
}
}

- (void) checkedCellAtIndex:(int)index
{
 BOOL boolChecked = [self getCheckedForIndex:index];

 [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithBool:!boolChecked] forKey:[self getKeyForIndex:index]];
 [[NSUserDefaults standardUserDefaults] synchronize];
 }

 - (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];

      if(section == 4) {
         if([self getCheckedForIndex:indexPath.row]==YES) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
          }
          else
          {
            cell.accessoryType = UITableViewCellAccessoryNone;
          }
      }
 }


 return cell;
 }

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
  UITableViewCell* cell = nil;

   NSString *key = [_keys objectAtIndex:indexPath.section];
   NSArray *name = [_names objectForKey:key];

   static NSString *MyCellIdentifier = @"Cell";

   cell = [tableView dequeueReusableCellWithIdentifier:nil];

   if (cell == nil){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:MyCellIdentifier];

    cell.textLabel.text = [name objectAtIndex:indexPath.row];
    if(section == 4) {
   [self checkedCellAtIndex:indexPath.row];

   if([self getCheckedForIndex:indexPath.row]==YES)
   {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
   }
   else
   {
        cell.accessoryType = UITableViewCellAccessoryNone;
   }
    }

  [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }

1 个答案:

答案 0 :(得分:1)

解决方案可能很棘手:

Maintain one array same to tableview datasource array.

比如说你有NSMutableArray *mutArrNames tableview datasource。现在NSMutableArray *mutArrNamesCheckList shows one is checked or not;

最初nothingselected所以add 0 to uncheck one

for(int i =0; i<[mutArrNames count];i++)
{
    [mutArrNamesCheckList addObject:@"0"];
}

现在使用这样:

- (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];

   if(section == 4) {
     //check from mutArrNamesCheckList's list if cell is check one or not
     if([[mutArrNamesCheckList objectAtIndex:indexPath.row] intValue] == 1) //checked one
     {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
     }
     else //unchecked one
     {
        cell.accessoryType = UITableViewCellAccessoryNone;
     }
   }
  }
  return cell;
}

此处可根据您的要求使用allow mutiple selection or single selection

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   //get cell object
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

   if(section == 4) 
   {
      if([[mutArrNamesCheckList objectAtIndex:indexPath.row] intValue] == 1) //checked one
      {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        //replace 0 with 1 as check one
        [mutArrNamesCheckList replaceObjectAtIndex:indexPath.row withObject:@"0"];
      }
      else //unchecked one
      {
        cell.accessoryType = UITableViewCellAccessoryNone;
        //replace 1 with 0 as uncheck one
        [mutArrNamesCheckList replaceObjectAtIndex:indexPath.row withObject:@"1"];
      }
   }
}

对于所有selection的{​​{1}}和unselection,请在cell中添加此内容。使用此:

button's action method

//remove all as new objects will be added [mutArrNamesCheckList removeAllObjects]; if(!btnCheckAll.selected)//selected property used - default is no so all not selected { //make all selected for(int i =0; i<[mutArrNames count];i++) { [mutArrNamesCheckList addObject:@"1"]; } //change buttons image here } else { //make all unselected for(int i =0; i<[mutArrNames count];i++) { [mutArrNamesCheckList addObject:@"0"]; } //change buttons image here } //tableView reload [yourtableView reloadData]; btnCheckAll.selected = !btnCheckAll.selected; 中的mutArrNamesCheckList添加为AppDelegate中的visible

所以whole Application我们在remove iteration top of above answer完成了our viewcontroller我们didn't希望use gobally

编辑:在toggling中添加didSelectRowAtIndexPath +点击全选按钮,检查所有单元格,否则取消选中