2015-04-13 4 views
-1

веб-программист пытается узнать ios. У меня есть настройка, которая, как мне кажется, довольно распространена. Просмотр таблицы, подробный экран, добавление экрана нового элемента и редактирование экрана элемента.ios/xcode/coredata: Лучший способ обновить экраны

Следуя различным учебным пособиям, я сохраняю изменения данных в контексте управляемого объекта и, следовательно, в постоянном хранилище. Эта часть работает нормально. Тем не менее, я пытаюсь использовать шаблон делегата, чтобы заставить экраны отражать изменения, а экраны не обновляются (ни представление таблицы, ни подробное представление.) Детальное представление представлено с помощью навигации BTW, а экраны добавления и редактирования являются модальными ,

Каков правильный способ обновления экранов?

Я попытался обо всем, так что следующий код из поля зрения таблицы только один пример того, что я пытался ... объявить вид таблицы контроллера в качестве делегата и реализовать необходимые методы, но я явно не хватает кое-что:

@interface IDTVC : UIViewController<UITableViewDataSource, UITableViewDelegate,NSFetchedResultsControllerDelegate> 
    @property (strong, nonatomic) IBOutlet UITableView *tableView; 
    @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

in .m file: 

in nsfetchedresultscontroller 
self.fetchedResultsController.delegate=self; 

in view will appear 

[[self tableView] reloadData]; 

Спасибо за четкое объяснение того, как это сделать, если есть принятый способ или любые другие предложения.

ответ

0

Поскольку вы используете делегатов, если вы добавляете строку, вы можете использовать -tableView:insertRowsAtIndexPath:. Если вы редактируете строку, вы можете использовать -tableView:reloadRowsAtIndexPath:. Добавьте их в методы делегата, поэтому, когда вы добавляете что-то, он вызывает один из этих методов.

+0

какие методы делегата? – user1904273

+0

Также, при добавлении строк появляются первые 9. После этого появляется новая строка, но она копирует ту же информацию, что и последняя строка. Другими словами, если вы создаете строки 1 ... 9, в виде таблицы показаны 1,2,3,4,5,6,7,8,9, но затем каждый из них составляет 9, т.е. 1,2,3,4,5, 6,7,8,9,9,9,9,9,9,9,9 и т. Д. – user1904273

0

Я пытался использовать заявление Apple в документации, которая реализует протокол NSFetchedResultsController. «Делегат должен реализовать по крайней мере один из методов делегирования отслеживания изменений, чтобы включить отслеживание изменений. Предоставление пустой реализации контроллераDidChangeContent : достаточно."

Это было выше flaky поведение, то есть он работал бы до 9, а затем прекратить обновление.

Решение было использовать полный набор кода из документации:

/* 
Assume self has a property 'tableView' -- as is the case for an instance of a UITableViewController 
subclass -- and a method configureCell:atIndexPath: which updates the contents of a given cell 
with information from a managed object at the given index path in the fetched results controller. 
*/ 

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView beginUpdates]; 
} 


- (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)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 configureCell:[tableView cellForRowAtIndexPath:indexPath] 
        atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
         withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 
} 
Смежные вопросы