如何创建动态大小的数组

Jon*_*rft 0 cocoa-touch objective-c uitableview ios

我想要实现的目标:

我有一个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;
    }  
}
Run Code Online (Sandbox Code Playgroud)

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

我是目标C的新手,我来自PHP背景,因此我不知道是否有可能创建一个数组来完成我想在objective-c中做的事情.

否则,在objective-c中我有什么选择可以轻松写入/读取 selected[row] = YES/NO.

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

rma*_*ddy 5

使用NSMutableSet并存储NSIndexPath选定的行.如果选择一行,则添加该集的路径.如果取消选择行,请从集中删除路径.

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

BTW - 这仅在行被修复时才有效.如果用户可以添加,删除或重新排序行,则此方法将不起作用.在这种情况下,您需要存储数据键,而不是索引路径.

创建一个类型的ivar NSMutableSet.我们称之为selectedRows:

selectedRows = [[NSMutableSet alloc] init];
Run Code Online (Sandbox Code Playgroud)

然后在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];
    }  
}
Run Code Online (Sandbox Code Playgroud)

在你的cellForRow...方法中你做了类似的事情:

BOOL selected = [selectedRows containsObject:indexPath];
cell.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
Run Code Online (Sandbox Code Playgroud)