2012-03-07 4 views
10

Я использую UITableViewController для таблицы в моем приложении, и я добавил NSFetchedResultsController, чтобы предоставить данные для отображения в таблице (установка self в качестве ее делегата).Добавить дополнительную строку в UITableView, управляемую NSFetchedResultsController

Однако я хотел бы добавить уникальную ячейку в качестве последней ячейки таблицы, не связанной с элементами, создаваемыми предикатом NSFetchedResultsController, я хочу, чтобы эта ячейка всегда находилась в нижней части таблицы.

Я пытался просто добавили 1 к этим методам в таблице источника данных:

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 
- (NSUInteger)tableView:(UITableView *)sender numberOfRowsInSection:(NSUInteger)section 
{ 
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects] + 1; 
} 

А потом ловила случай, когда эта дополнительная строка который генерируется таким образом (таблица имеет только 1 раздел) :

- (UITableViewCell *)tableView:(UITableView *)sender 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == [self.fetchedResultsController.fetchedObjects count]) { 
     //Generate the last cell in table. 
    } else { 
     //Generate the rest of the cells like normal. 
    } 
    return nil; //To keep the compiler happy. 
} 

Это проверяет, является ли индекс последней ячейкой и имеет дело с ней соответствующим образом.

Однако я все еще получаю следующее сообщение об ошибке во время выполнения:

*** Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

Любая идея, что причиной этого? Или есть лучший способ добавить дополнительную строку в представление таблицы, контролируемое NSFetchedResultsController?

ответ

13

Контроллер выбранных результатов довольно тесно связан с табличным представлением, если вы реализуете все методы источника данных, как указано в документации (обновления и т. Д.). Он станет довольно грязным и взломанным.

Может ли ваш «дополнительный ряд» быть нижним колонтитулом стола? Это всегда будет внизу. Было бы не слишком много работы, чтобы сделать его похожим на ячейку, хотя из-за внешнего вида вы хотите, чтобы она выглядела по-другому в других ячейках.

+0

Ах да, это будет на самом деле намного лучший способ реализовать это, спасибо. (По-видимому, я все еще очень новичок в программировании на iOS :-)) –

+0

Да, он очень взломан. Эта идея так же проста, как великая ...Большое спасибо! – Shingoo

+0

, но это выглядит так: http://stackoverflow.com/questions/10965098/nsfetchedresultscontroller-prepend-a-row-or-section –

2

Учитывая таблицу только имеет один раздел, этот код выглядит неправильно:

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 

Я подозреваю, возникает ваша авария, когда TableView пытается получить вторую секцию; + 1 следует удалить.

Возможно сделать более сложные вещи со столами, полученными от выбранных контроллеров результатов (см. NSFetchedResultsController prepend a row or section), поэтому я уверен, что этот простой случай можно заставить работать.

+0

По-прежнему tableView: cellForRowAtIndexPath: будет называться [[self.fetchedResultsController sections] count] раз. –

0

Почему вы не используете встроенные представления заголовка и нижнего колонтитула UITableView?

Пример:

UIView *customBottomView = [UIView alloc] init... //set up your View (what you called custom bottom cell)

self.table.tableFooterView = customBottomView; // альтернативно tableHeaderView

Технически вы добавляете представление, отображаемое ниже (или выше) таблицу, которая добавляется в таблицу и прекрасно обрабатывается TableView. Для пользователей нет способа определить, является ли это (последней) ячейкой или просто представлением. Вам просто нужно будет работать, если вы планируете использовать такие методы, как didSelectRowAtIndexPath

Смежные вопросы