0

我想要达到的目标:

我有一个 UITableView,我想检查表是否被选中,并保存在一个数组中,以便于访问对应于该行的 YES 或 NO 值,以便之后我可以操作数据。

我的代码如下

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *cellLabelText = cell.textLabel.text;

    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        selected[row] = NO;
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        selected[row] = YES;
    }  
}

很明显,我可以创建一个BOOL selected[some value],但我的问题是我需要的最大索引是未知的,因为我的表大小不断变化。因此设置最大索引限制了我。

我是 Objective C 的新手,我来自 PHP 背景,因此我不知道是否可以创建一个数组来执行我想要在 Objective-C 中做的事情。

否则,我在 Objective-c 中的选择是什么 selected[row] = YES/NO

我需要一种写 YES/NO 并将其链接到 indexpath.row 的方法

4

4 回答 4

5

使用NSMutableSet并存储NSIndexPath所选行的。如果您选择一行,则将路径添加到集合中。如果取消选择行,请从集中删除路径。

要查看是否选择了行,请查看 indexPath 是否在集合中。

顺便说一句 - 这仅在行固定时才有效。如果用户可以添加、删除或重新排序行,那么这种方法将不起作用。在这种情况下,您需要存储数据键,而不是索引路径。

创建一个 类型的 ivar NSMutableSet。让我们称之为selectedRows

selectedRows = [[NSMutableSet alloc] init];

然后在didSelectRow你做:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    BOOL selected = [selectedRows containsObject:indexPath];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *cellLabelText = cell.textLabel.text;

    if (selected) {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [selectedRows removeObject:indexPath];
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [selectedRows addObject:indexPath];
    }  
}

在您的cellForRow...方法中,您执行类似的操作:

BOOL selected = [selectedRows containsObject:indexPath];
cell.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
于 2013-05-14T19:28:03.647 回答
1

只需使用

NSMutableArray *dynamicArray = [NSMutableArray array]; 

您可以随意添加和删除对象。只需确保使用NSNumber包装器添加原语:

[dynamicArray addObject:[NSNumber numberWithInt:indexNumber]];
// or
[dynamicArray addObject:@(indexNumber)];
于 2013-05-14T19:29:20.990 回答
1

您可以使用索引集代替数组。

@property (nonatomic,strong) NSMutableIndexSet *pickedIndexPaths;

- (void)viewDidLoad
{
    _pickedSIndexPaths = [[NSMutableIndexSet alloc] init];
    [super viewDidLoad];
}


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

    if(indexPath.section == 0) {
        cell.textLabel.text = self.sports[indexPath.row][@"sport"][@"name"];
        if ([_pickedIndexPaths containsIndex:indexPath.row]) {
            [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
        } else {
            [cell setAccessoryType:UITableViewCellAccessoryNone];
        }
    }
    return cell;
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([_pickedIndexPaths containsIndex:indexPath.row]) {
        [_pickedIndexPaths removeIndex:indexPath.row];
    } else {
        [_pickedIndexPaths addIndex:indexPath.row];
    }
    [tableView reloadData];
    }
}
于 2013-05-14T19:44:02.127 回答
0

当您需要一个可变长度的布尔值数组时,您可以使用CFBitVectorRef. 这将比使用为 objc 对象值设计的 Cocoa 集合消耗更少的内存(当然前提是该数组具有许多元素),因为它为每个值消耗 1 位,而不是指向单个动态分配的引用计数对象的完整指针.

于 2013-05-14T19:42:45.713 回答