在NSMutableArray中使用BOOL对象来确定单元状态

时间:2014-01-21 04:32:13

标签: ios objective-c uitableview nsmutablearray

我正在使用引用为“stateArray”的NSMutableArray。 stateArray需要简单地保存我的单元格的BOOL值,以确定它们是否被选中。这是我的代码..

状态阵列在我的.h:

@property (nonatomic, strong) NSMutableArray *stateArray;

然后stateArray 不是合成的。它需要在整个数组中填充NO,以便在单元格被选中时,NO可以替换为YES。目前,此代码为每个单元格的stateArray打印0(NSLog位于if (showCheckmark == YES)的{​​{1}})。

cellForRowAtIndexPath:

3 个答案:

答案 0 :(得分:2)

要跟踪所选项目,请使用Dictionary代替NSMutableArray,并将indexPath.row保留为,并选择相应的值< /强>

此外,您可以使用BOOL's数组执行这些操作,而不是按以下方式更新代码。

@property (nonatomic, strong) NSMutableDictionary * selectedRowCollection;

- (void)viewDidLoad{

    self.selectedRowCollection = [[NSMutableDictionary alloc] init];
}

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

    if (cell.accessoryType == UITableViewCellAccessoryNone)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [self.selectedRowCollection setObject:@"1" forKey:[NSString stringWithFormat:@"%d",indexPath.row]]; 
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [self.selectedRowCollection removeObjectForKey:[NSString stringWithFormat:@"%d",indexPath.row]];
    }

    //slow-motion selection animation.
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    BOOL showCheckmark =  [[self.selectedRowCollection valueForKey:[NSString stringWithFormat:@"%d",indexPath.row]] boolValue];

    if (showCheckmark == YES)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;

    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
}

注意:请勿忘记在重新加载新的tableview数据集时从字典中删除字典项。

答案 1 :(得分:1)

BOOL值包含NSNumber,这就是你得到0的原因:

_stateArray = [NSMutableArray array];
for (int i = 0 ; i != contactsObjects.count ; i++) [_stateArray addObject:@(NO)];

BOOL showCheckmark = [[_stateArray objectAtIndex:indexPath.row] boolValue];

if (showCheckmark == YES)
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    NSLog(@"It hit showCheckmark = YES, and stateArray is %@",[[_stateArray objectAtIndex:indexPath.row] boolValue] ? @"YES" : @"NO");
}
else
{
    cell.accessoryType = UITableViewCellAccessoryNone;
    NSLog(@"It hit showCheckmark = NO, and stateArray is %@",[[_stateArray objectAtIndex:indexPath.row] boolValue] ? @"YES" : @"NO");
}

BOOL不是对象,因此您无法使用%@格式说明符。你需要手动处理这个

答案 2 :(得分:0)

试试这个,

更新您的循环以通过

填充_stateArray
for (int i = 0 ; i != contactsObjects.count ; i++) {

     [_stateArray addObject:[NSNumber numberWithBool:NO]];
}