0

我有一个 tableView,我通过将行的 indexPath 添加到数组然后添加复选标记来跟踪选择了哪些行。

我正在使用 cellForRowAtIndexPath 方法中的这段代码迭代该数组,它就像一个魅力:

for (NSIndexPath * element in indexArray)
    if ([indexPath compare:element] == NSOrderedSame) { 
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

但是,我也将该行的值放入另一个数组中以用于其他目的。我想如果我在这两种情况下都使用第二个数组,我可以简化我的代码,但我不明白我将如何重写上面的代码。我明白了这个概念,但上面的代码使用了 indexPath 比较,我需要将字符串与数组进行比较。

这是我不知道如何改变的“如果”线。

for (NSString *element in valueArray) {
    if ([indexPath compare:element] == NSOrderedSame) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
}  

想法?谢谢。

编辑更多信息

我的数组包含 400 个不会更改的唯一项目。将他们的 indexPath 添加到我的数组并遍历它以添加复选标记工作正常。我想使用数组的字符串值进行迭代的原因是因为我想向 tableView 添加一个 searchBar。

添加该 searchBar 后,当我进行搜索时,searchResultsTableView 会将我的 400 个唯一项目截断为与该搜索匹配的少数项目 - 所以我们的 searchResultsTableView 中只有一行或几行。现在假设我们选择了搜索中返回的第一行 - 然后我的代码将该行的 indexPath 添加到我的 indexArray 以跟踪复选标记。它将添加索引 0,0。

但是当我们取消搜索模式时,第一行 0,0 将在我的 tableView 中检查,因为我们在 searchResultsTableView 中选择了 0,0 - 即使我们选择的行将在完整 tableView 中的列表下方。看看我要去哪里?所以我的想法是跟踪行的字符串而不是它的 indexPath 来缓解这个问题。

更清晰?

4

2 回答 2

0

您可以使用字符串和索引值创建 ac 结构,并将其包装到 NSValue 对象中,然后将该对象放入 NSArray? 然后您可以修改您的 for() 循环和 if() 子句以使用 NSValue? 请参阅如何将 Struct 包装到 NSObject 中

于 2012-10-23T15:48:51.877 回答
0

您可以使用一组(可变)字典作为表视图的数据源。每个字典都包含NSNumber一行的文本值和选择状态 (as )。(我在这里假设您的表格视图只有一个部分)。

然后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"];

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

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

于 2012-10-23T16:37:57.433 回答