将快速枚举从indexPath更改为string

时间:2012-10-23 15:25:35

标签: ios uitableview

我有一个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来缓解这个问题。

更清楚?

2 个答案:

答案 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"];

现在为您的搜索,您将创建该数组的过滤子集。但由于过滤后的数组引用相同的词典,因此当您更改搜索文本或完成搜索时,将保留每个条目的选择状态。

当搜索处于活动状态时,您必须在上述方法中使用过滤后的数组。