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 forNSMutableIndexSet
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) 会像这样崩溃?