2

NSFetchedResultsControllerで述語を使用してUITableViewを並べ替えています。ただし、詳細ビューに変更を加えて保存すると、変更したオブジェクトはすぐにUITableViewの新しい場所に配置されます。

メールのメッセージビューに似た上/下ボタンがあります。この動作によりアイテムの順序が乱れます。UXの理由でユーザーがUITableViewに戻るまで、この変更を遅らせたいと思います。UITableViewControllerにNSFetchedResultsControllerDelegateメソッドを実装しました。これを行う簡単で賢い方法はありますか?

編集:以下は、UITableViewControllerに実装されているNSFetchedResultsControllerDelegateメソッドです。

- (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];
}
4

2 に答える 2

3

問題はNSFetchedResultsControllerDelegateメソッドにはありません。これらのメソッドは、テーブルが表示されているときに何かがデータモデルを変更した場合にのみ機能します。

問題は、テーブルビューが画面外で非アクティブなときにデータを変更することです。テーブルビューは、与えられたデータモデルを自動的に表示するように設計されています。詳細ビューからテーブルビューに戻ると、詳細ビ​​ューで行われた変更を含むデータが自動的に再ロードされます。これは、テーブルにデータをどのように提供したかに関係なく行われます。

必要になるまでテーブルに変更が表示されないようにする唯一の方法は、変更を表示するまでデータをデータモデルに追加しないことです。詳細ビューから非管理対象オブジェクトのテーブルにデータを戻し、表示したいときにテーブルビューコントローラーで管理対象オブジェクトを作成する必要があります。

ただし、UIデザインの観点からは、デザインを再考することをお勧めします。リロードするまでテーブルを変更しない場合、変更を行うことをユーザーにどのように通知しますか?明らかな理由もなく、UIが突然更新されますか?ユーザーはそれを開始する必要がありますか?彼らが忘れたらどうしますか?

ユーザーは、詳細ビューで行われた変更がテーブルビューに即座に反映されることを期待していると思います。これは、事実上すべてのテーブルビューとdetailViewの組み合わせが機能するためです。たとえば、アドレスブックの連絡先の詳細で連絡先の名前を変更すると、連絡先のリストに戻ったときにすぐに反映されます。

于 2010-07-15T13:04:30.173 に答える
0

私が使用したトリックの1つは、テーブルビューコントローラーが表示されなくなったときにbeginUpdatesを呼び出し、表示されたときにendUpdatesを呼び出すことです。

- (void)viewWillAppear:(BOOL)animated{
    [self.tableView endUpdates];
    [super viewWillAppear:animated];
}

- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    [self.tableView beginUpdates];
}

このようにして、フェッチコントローラは機能し続けることができ、他の目的で更新を使用し続けることができます。

于 2016-03-23T01:16:42.873 に答える