比较 NSIndexPath
Posted
技术标签:
【中文标题】比较 NSIndexPath【英文标题】:Comparing NSIndexPath 【发布时间】:2013-06-24 15:22:37 【问题描述】:这将是一件非常愚蠢的事情,但我的 cellForRowAtIndexPath 中有这段代码:
if ([self.indexPathSelected compare:indexPath] == NSOrderedSame)
NSLog(@" %d %d %d %d", self.indexPathSelected.row, self.indexPathSelected.section, indexPath.row, indexPath.section);
打印出来:
0 0 0 0
0 0 1 0
0 0 2 0
0 0 3 0
0 0 4 0
0 0 5 0
我原以为它只会打印 0 0 0 0。
我在这里做错了什么?
【问题讨论】:
indexPathSelected
是否设置为 nil ?
是的。将其更改为 self.indexPathSelected = [NSIndexPath indexPathForRow:-1 inSection:-1];修复。两个后续问题,为什么'nil'不起作用?第二个是将其设置为 -1、-1 是否正确?
向 nil 发送消息将始终导致 nil => 0。只需检查您是否在与 nil 进行比较。
【参考方案1】:
由于您将 indexPathSelected 设置为 nil,因此您需要在进行比较之前确保它为非 nil。
if (self.indexPathSelected && [self.indexPathSelected compare:indexPath] == NSOrderedSame)
NSLog(@" %d %d %d %d", self.indexPathSelected.row, self.indexPathSelected.section, indexPath.row, indexPath.section);
根据NSIndexPath's compare method上的文档:
参数
索引路径
要比较的索引路径。
这个值不能为零。如果值为 nil,则行为为 未定义。
【讨论】:
改用[indexPath compare:self.indexPathSelected]
,这样就不用检查self.indexPathSelected是否为nil了。【参考方案2】:
有趣的是你可以像比较指针一样比较对象。但仅限于 iPhone 5s 甚至更高版本。我今天发现了这个笑话)。所有设备上的 ios 都是 8.1
适用于 iPhone 5s 及更高版本:(将比较部分和行)
if (optionsPath != pathForOptionsCellOfSelected)
//if ([optionsPath compare:pathForOptionsCellOfSelected] != NSOrderedSame)
//if user selects cell under already selected, we do not need to shift index
if (optionsPath.row < selectedRowIndexPath.row)
pathForOptionsCellOfSelected = selectedRowIndexPath;
[_tableView insertRowsAtIndexPaths:@[pathForOptionsCellOfSelected] withRowAnimation:UITableViewRowAnimationTop];
optionsPath = [pathForOptionsCellOfSelected copy];
无论如何这不是一个好方法。
【讨论】:
以上是关于比较 NSIndexPath的主要内容,如果未能解决你的问题,请参考以下文章