Уменьшить indexPath на один - PullRequest
8 голосов
/ 22 ноября 2011

Я заполняю TableView с CoreData.

До сих пор я делал что-то вроде этого:

        NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

... чтобы получить объект для заполнения строки.

Все работало нормально, пока я не понял, что должен управлять первой строкой таблицы как исключением, поскольку первая строка будет содержать другое содержимое, не предоставляемое CoreData.

Теперь моя проблема в том, как я могу манипулировать indexPath, чтобы сместить все на единицу. Я хотел бы сделать что-то вроде этого:

// I know this is not going to work, just to give you an idea...
   NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath-1];

но я не могу найти правильный синтаксис для манипулирования indexPath. Может кто-нибудь мне помочь? Спасибо за ваше время!

Ответы [ 2 ]

12 голосов
/ 22 ноября 2011

В случае, если мы говорим об индексном пути iOS UITableView, есть гораздо более простой способ:

NSIndexPath* newIndexPath = [NSIndexPath indexPathForRow:oldIndexPath.row+1 inSection:oldIndexPath.section];

Ура ... :)

2 голосов
/ 22 ноября 2011

Если вы говорите о стандартном iOS UITableView, то ваш путь индекса является экземпляром NSIndexPath и будет иметь две записи: индекс section и индекс row . Если я вас правильно понимаю, вы хотите уменьшать индекс row на 1 каждый раз, когда вы заполняете ячейку табличного представления. (Я предполагаю, что у вас есть только один раздел, или вам нет дела до индекса раздела - если это не так, пожалуйста, отредактируйте ваш вопрос.)

По сути, вам нужно создать новый экземпляр NSIndexPath с вашими скорректированными индексами, а затем использовать его для запроса к вашему контроллеру полученных результатов. Примерно так будет работать (не проверено):

NSUInteger indexes[2];
[indexPath getIndexes:indexes];
indexes[1]--;
NSIndexPath * adjustedIndexPath = [[NSIndexPath alloc] initWithIndexes:indexes
                                                                length:2];
NSManagedObject * managedObject = [self.fetchedResultsController
                                    objectAtIndexPath:adjustedIndexPath];

Это в основном делает следующее:

  1. Извлекает существующие индексы в массив C NSUIntegers
  2. Уменьшает последний индекс (в позиции 1 - индекс строки) на 1
  3. Создает новый NSIndexPath с настроенными индексами из массива C
  4. Извлекает управляемый объект, используя новый путь индекса

Обратите внимание, что это не касается индекса раздела вообще, и поэтому будет корректировать каждую ячейку в вашей таблице, независимо от того, находится ли она в вашем первом разделе. Если это не то, что вам нужно, либо оберните корректировку в условное выражение (например, if([indexPath indexAtPosition:0] == 0)), либо добавьте свою собственную пользовательскую логику.

...