我想要实现的目标:
我有一个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
答案 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位,而不是指向单个动态分配的引用计数对象的完整指针