Привязать строку с помощью NSFetchedResultsController

#ios #uitableview #anchor #nsfetchedresultscontroller

#iOS #uitableview #привязка #nsfetchedresultscontroller

Вопрос:

Я пытаюсь сделать так, чтобы у моего UITableView всегда была определенная строка внизу, привязанная там.

Я использую NSFetchedResultsController для выполнения выборки, а затем обычный шаблон Apple для обнаружения изменения объединенного контекста.

Что я хотел бы сделать, так это всегда иметь одну строку внизу результатов «Не то, что вы ищете?». Как бы я это сделал? Меня устраивают пользовательские типы ячеек, но я не могу получить даже ячейку того же типа для привязки к нижней части.

Код, который добавляет на одну строку больше, чем в fetchedResultsController:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return[sectionInfo numberOfObjects] 1;
}
  

Код для cellForRowForIndexPath:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifierNormal = @"NormalCell";

UITableViewCell *cell = nil;
cell = [tableView CellIdentifierNormal];

    if (cell == nil) {
        cell = [[NormalCell createCell]autorelease];
    }
// For regular results, go configure the cell. For the extra 'Special Row' at bottom, assign it the Special cell.
if([indexPath indexAtPosition:0] <= [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects])
     [self configureCell:cell atIndexPath:indexPath];
else {
    if (cell == nil) {
        cell = [[SpecialCell createCell] autorelease];
    }
    SpecialCell *nc = (SpecialCell*)cell;
    nc.labelFirstLine.text = @"Not What You're Looking For?";
}
return cell;
}
  

Это сработало бы, если бы не использовался NSFetchedResultsController, но происходит то, что всякий раз, когда ячейка обновляется, из контроллера вызывается метод ‘configureCell’, который ничего не знает о SpecialCell.

Из — (void)контроллера: (NSFetchedResultsController *)контроллер изменил объект:……

  case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;
  

И вот configureCell:

 - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
// Configure the cell
// Go get it from coredata
    NormalCell *vc = (NormalCell*)cell;
NormalObject *no = (NormalCell *)[fetchedResultsController objectAtIndexPath:indexPath];
....<ASSIGNMENT TO CELL HERE>....
  

}

Комментарии:

1. для лучшего ответа, пожалуйста, опубликуйте код cellForRowAtIndex .

Ответ №1:

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

Для получения дополнительной информации, пожалуйста, добавьте код…

Комментарии:

1. Обновлено с новым кодом. Ваш подход работает для прямого UITableView. Но это для контекста CoreData, получающего новые данные, и NSFetchedResultsController вызывает configureCell. Я не знаю, как различать типы ячеек (NormalCell, SpecialCell) внутри ConfigureCell