TableView 中的 indexPath 比较

Posted

技术标签:

【中文标题】TableView 中的 indexPath 比较【英文标题】:indexPath comparison in TableView 【发布时间】:2017-08-14 00:42:23 【问题描述】:

我将选定的indexPath 存储在可变字典`selectedRowsInSectionDictionary 中,如下所示。

例如在下面的字典中,第一部分是关键。在本节中,第一行 (1,0)、第二行 (1,1) 和第三行 (1,2) 已被选择并存储在字典中。

我正在尝试检查这些indexPath 是否存储在cellForRowAtIndexPath 委托方法中的字典中,但它总是返回false。我想知道我做错了什么?

if([selectedRowsInSectionDictionary objectForKey:@(indexPath.section)] == indexPath)

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

【问题讨论】:

尝试 isEqual: 在比较条件中替换 == 的方法。还要确保从字典返回的对象实际上是一个 NSIndexPath 对象。 How to compare two NSIndexPaths?的可能重复 @ShamasS,实际上我的问题略有不同,我有一个 indexPathes 数组要检查。 【参考方案1】:

[selectedRowsInSectionDictionary objectForKey:@(indexPath.section)]NSMutableArray 引用,而不是 indexPath,因此比较永远不会正确。

我建议您将NSMutableIndexSet 存储在字典中,而不是数组中。您的代码将类似于:

NSMutableIndexSet *selectedSet = selectedRowsInSectionDictionary[@(indexPath.section)];
if ([selectedSet containsIndex:indexPath.row] 
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
 else 
    cell.accessoryType = UITableViewCellAccessoryNone;

要使用“切换”向字典添加/删除项目,您将使用:

NSMutableIndexSet *selectedSet = selectedRowsInSectionDictionary[@(indexPath.section)];

if (selectedSet == nil) 
    selectedSet = [NSMutableIndexSet new];
    selectedRowsInSectionDictionary[@(indexPath.section)] = selectedSet;


if ([selectedSet containsIndex:indexPath.row]) 
    [selectedSet remove:indexPath.row];
 else 
    [selectedSet add:indexPath.row];

【讨论】:

显示如下错误 no visible interface for NSMutableIndexSet has contains method. 抱歉,Swift 和 Objective-C 的方法名是有区别的。我已经更新了 你对相关问题有什么想法***.com/questions/48483622/…【参考方案2】:

这是失败的,因为字典的值是一个数组。

据我所知

[selectedRowsInSectionDictionary objectForKey:@(indexPath.section)]

将返回一个包含 3 个元素的数组(NSIndexPaths)。 您应该能够将代码修改为以下内容:

if([[selectedRowsInSectionDictionary objectForKey:@(indexPath.section)] containsObject:indexPath]

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

我已通过以下测试代码确认了这一点:

NSIndexPath *comparisonIndexPath = [NSIndexPath indexPathForRow:2 inSection:0];
NSDictionary *test = @ @(1): @[[NSIndexPath indexPathForRow:1 inSection:0],
                                comparisonIndexPath,
                                [NSIndexPath indexPathForRow:3 inSection:0]];
NSArray *indexPathArray = [test objectForKey:@(1)];
if ([indexPathArray containsObject:comparisonIndexPath]) 
    NSLog(@"Yeeehawww, let's do some stuff");

【讨论】:

以上是关于TableView 中的 indexPath 比较的主要内容,如果未能解决你的问题,请参考以下文章

删除 TableView 中的行后如何更新 indexPath?

带有 Sections [indexPath Row] 的 TableView 中的 NSRangeException 超出范围

Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?

什么 tableView.reloadRows(at: [indexPath], with: .none) 会像这样崩溃?

仅当 indexPath 对象可用时,如何在 tableview 单元格上使用标签

tableView.reloadRows(at:[indexPath],带有:.none)会像这样崩溃吗?