This is going to be something really stupid, but I have this code in my cellForRowAtIndexPath:

if ([self.indexPathSelected compare:indexPath] == NSOrderedSame)
{
    NSLog(@" %d %d %d %d", self.indexPathSelected.row, self.indexPathSelected.section, indexPath.row, indexPath.section);
}

This prints:

0 0 0 0

0 0 1 0

0 0 2 0

0 0 3 0

0 0 4 0

0 0 5 0

I was expecting it to only print 0 0 0 0.

What am I doing wrong here?

有帮助吗?

解决方案

Since you're setting indexPathSelected to nil, you want to make sure it's non-nil before doing a compare.

if (self.indexPathSelected && [self.indexPathSelected compare:indexPath] == NSOrderedSame)
{
    NSLog(@" %d %d %d %d", self.indexPathSelected.row, self.indexPathSelected.section, indexPath.row, indexPath.section);
}

According to the documentation on NSIndexPath's compare method:

Parameters

indexPath

Index path to compare.

This value must not be nil. If the value is nil, the behavior is undefined.

其他提示

Interesting thing is that you can compare object like you compare pointers. But only on iPhone 5s and maybe higher. I have found this joke today). iOS on all devices was 8.1

Will work on iPhone 5s and higher: (will compare section and row)

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];
}

Anyway its not a good approach.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top