0

Я основал мое приложение на примере проекта 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]; 
} 
+0

ли вы включить 'ARC'? Если нет, возврат ячейки по -tableView: cellForRowAtIndexPath: должен быть автореализован. – AechoLiu

+0

Вы использовали 'NSFetchedResultController'. Итак, можете ли вы опубликовать коды о настройке fetchedResultController? И коды о [fetchedResultsController performFetch: ...]. Кстати, после изменения атрибутов управляемого объекта вы вызываете [tableView reloadData] для обновления вида таблицы? – AechoLiu

+0

Да, я использую ARC. Вызов '[self.tableView reloadData]' помогает решить проблему перезагрузки данных в моей отдельной пользовательской ячейке. Однако все же нужно решить, что нечетные ячейки перекрываются, я отправлю код, который вы запросили. –

ответ

0

Я реализую ту же функцию и использую смещение с помощью решения indexPath @ Toro. Не знаю, есть ли лучший способ или нет, это моя настройка для заинтересованных.

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

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

- (NSIndexPath *)adjustedIndexPath:(NSIndexPath *)indexPath 
{ 
    NSIndexPath *newPath = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section]; 
    return newPath; 
} 

частный метод для регулировки indexpath, чтобы получить правильный объект из NsFetchedResultController.

Вот метод, который я применяю adjustedIndexPath:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
Смежные вопросы