Сравнение 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];
}
Во всяком случае, это не очень хороший подход.