#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