比较 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的主要内容,如果未能解决你的问题,请参考以下文章

java对象的比较

JavaScript 比较操作符,严格比较===

CDateTimeCtrl类型的日期如何比较大小

java中Comparable和Comparator两种比较器的区别

BigDecimal 怎么比较大小

js两个时间大小的比较问题(只有时间比较,比如14:00和15:00的比较)