我有一个tableView,我跟踪通过将行的indexPath添加到数组然后添加复选标记来选择哪些行。
我正在使用我的cellForRowAtIndexPath方法中的这段代码迭代该数组,它就像一个魅力:
for (NSIndexPath * element in indexArray)
if ([indexPath compare:element] == NSOrderedSame) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
但是,我也正在获取该行的值并将其放入另一个数组中以用于其他目的。我想我可以简化我的代码,如果我只是在这两种情况下使用了第二个数组,但我不明白我是如何重写上面的代码。我得到了概念,但上面的代码使用了indexPath比较,我需要将字符串与数组进行比较。
这就是'if'行,我不知道如何改变。
for (NSString *element in valueArray) {
if ([indexPath compare:element] == NSOrderedSame) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
思考?感谢。
使用更多信息进行修改
我的数组包含400个不会更改的唯一项。将indexPath添加到我的数组并迭代它以添加复选标记工作正常。我之所以想要迭代使用数组的字符串值是因为我想将searchBar添加到tableView。
在我添加searchBar之后,当我进行搜索时,searchResultsTableView会将我的400个唯一项目截断为与该搜索匹配的少数项目 - 所以我们在searchResultsTableView中只有一行或几行。现在让我们说我们选择在搜索中返回的第一行 - 然后我的代码将该行的indexPath添加到我的indexArray以跟踪复选标记。它会添加索引0,0。
但是当我们取消搜索模式时,第一行0,0将在我的tableView中检查,因为我们在searchResultsTableView中选择了0,0 - 即使我们选择的行将在完整tableView中的列表中向下。看看我要去哪里?所以我的想法是跟踪行的字符串而不是它的indexPath来缓解这个问题。
更清楚?
答案 0 :(得分:0)
您可以创建一个包含字符串和索引值的c结构,并将其包装到NSValue对象中,然后将该对象放入NSArray中?然后,您可以修改for()循环和if()子句以使用NSValue?见How to wrap a Struct into NSObject
答案 1 :(得分:0)
您可以使用(可变)字典数组作为表视图的数据源。每个字典包含一行的文本值和选择状态(如NSNumber
)。 (我假设您的表视图只有一个部分)。
然后在cellForRowAtIndexPath
中,您可以执行类似
NSDictionary *d = [dataArray objectAtIndex:indexPath.row];
NSString *value = [d objectForKey:@"value"];
BOOL selected = [[d objectForKey:@"selected"] boolValue];
并相应地设置单元格的内容和附件类型。
要更改选择状态:
NSDictionary *d = [dataArray objectAtIndex:indexPath.row];
BOOL selected = [[d objectForKey:@"selected"] boolValue];
[d setObject:[NSNumber numberWithBool:!selected] forKey:@"selected"];
现在为您的搜索,您将创建该数组的过滤子集。但由于过滤后的数组引用相同的词典,因此当您更改搜索文本或完成搜索时,将保留每个条目的选择状态。
当搜索处于活动状态时,您必须在上述方法中使用过滤后的数组。