Сравнение NSIndexPath

Это будет что-то действительно глупое, но у меня есть этот код в моей 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.

Что я здесь делаю неправильно?

Ответ 1

Поскольку вы устанавливаете indexPathSelected в 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:

Параметры

indexPath

Указательный путь для сравнения.

Это значение не должно быть nil. Если значение равно нулю, поведение undefined.

Ответ 2

Интересно, что вы можете сравнивать объект, сравнивая указатели. Но только на iPhone 5 и, возможно, выше. Сегодня я нашел эту шутку). iOS на всех устройствах был 8.1

Будет работать на iPhone 5 и выше: (будет сравнивать раздел и строку)

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

Во всяком случае, это не очень хороший подход.