Я основал мое приложение на примере проекта Core Data Books Apple, и я сделал каждую ячейку пользовательской ячейкой, которая отображает определенные данные, работает магически.Ядро базы данных Пример Добавить пользовательскую ячейку
Однако теперь я пытаюсь добавить вторую пользовательскую ячейку. Это особая ячейка, которая всегда будет первой ячейкой в таблице, тогда все полученные данные из основных данных будут ниже этого.
Я попытался выглядеть примерно так:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
static NSString *CellIdentifier = @"statsCell";
GuestStatsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[GuestStatsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//Configure the cell.
[self configureStatsCell:cell];
return cell;
}
else
{
static NSString *CellIdentifier = @"guestCell";
customGuestCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[customGuestCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell.
[self configureGuestCell:cell atIndexPath:indexPath];
return cell;
}
}
Наряду с некоторыми другими изменениями, чтобы попытаться получить все заработало. Несколько проблем.
Во-первых, представление загружается отлично, я получаю свою собственную ячейку с индексом 0, а затем мои базовые ящики данных загружаются ниже этого. Первая проблема: самая первая ячейка данных ядра не видна, поскольку она скрыта за моей пользовательской ячейкой, но если я ее коснусь, я получаю подробное представление для этой основной записи данных. Поэтому мне нужно разобраться, как я могу остановить его позади этой пользовательской ячейки.
Я попытался исправить это, к примеру, вполне логично, что этот кусок:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
Таким образом, это только установка достаточно клеток для основных записей данных и не учитывает, что дополнительные пользовательские клетка. Так что я пытаюсь что-то просто, что это:
return [sectionInfo numberOfObjects] + 1;
Тогда это приводит к этой линии вызывает у меня, чтобы получить аварии и индекса за пределы ошибки ограничений:
GuestInfo *guest = [fetchedResultsController objectAtIndexPath:indexPath];
Эта линия является от метода configureCell, какие наборы основные ячейки записи данных. Так что я довольно тупой, что делать.
Следующая проблема, когда я редактирую атрибут любой записи основных данных в подробном представлении, возвращаясь к представлению таблицы, моя пользовательская ячейка не показывает никаких изменений. Он отображает статистику, связанную с информацией о данных ядра. Обновляются только другие ячейки.
Любая помощь была бы очень признательна, и если вам нужно больше узнать код или нужно больше объяснений, дайте мне знать.
EDIT:
Больше кода в соответствии с просьбой, чтобы помочь мне. Это код NSFetchedController.
- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController != nil)
{
return fetchedResultsController;
}
// Create and configure a fetch request with the Book entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"GuestInfo" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
// Create the sort descriptors array.
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
NSSortDescriptor *firstNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:lastNameDescriptor, firstNameDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Create and initialize the fetch results controller.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"displayOrder" cacheName:@"Root"];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
// Memory management.
//No releasing with ARC!
return fetchedResultsController;
}
/**
Delegate methods of NSFetchedResultsController to respond to additions, removals and so on.
*/
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureGuestCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
[self.tableView reloadData];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
ли вы включить 'ARC'? Если нет, возврат ячейки по -tableView: cellForRowAtIndexPath: должен быть автореализован. – AechoLiu
Вы использовали 'NSFetchedResultController'. Итак, можете ли вы опубликовать коды о настройке fetchedResultController? И коды о [fetchedResultsController performFetch: ...]. Кстати, после изменения атрибутов управляемого объекта вы вызываете [tableView reloadData] для обновления вида таблицы? – AechoLiu
Да, я использую ARC. Вызов '[self.tableView reloadData]' помогает решить проблему перезагрузки данных в моей отдельной пользовательской ячейке. Однако все же нужно решить, что нечетные ячейки перекрываются, я отправлю код, который вы запросили. –