如何创建动态大小的数组

时间:2013-05-14 19:24:58

标签: ios objective-c cocoa-touch uitableview

我想要实现的目标:

我有一个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],但我的问题是我需要的最大索引是未知的,因为我的表大小不断变化。因此设置最大索引限制了我。

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

创建NSMutableSet类型的ivar。我们称之为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;

答案 1 :(得分:1)

只需使用

NSMutableArray *dynamicArray = [NSMutableArray array]; 

您可以随意添加和删除对象。请务必使用NSNumber包装器添加基元:

[dynamicArray addObject:[NSNumber numberWithInt:indexNumber]];
// or
[dynamicArray addObject:@(indexNumber)];

答案 2 :(得分: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];
    }
}

答案 3 :(得分:0)

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