9

UITableViewController または NSFetchedResultsController に少し問題があります。どちらが問題なのかはわかりませんが、UITableViewController だと思います。

前述したように、NSFetchedResultsController を使用してデータを UITableViewController に入力します。データは日付でソートされ、2010 年 5 月/2010 年 6 月などの日付-年ごとのセクションにも表示されます。これは、セクション ヘッダーとして表示されます。

新しいデータを追加すると、現在の日付がデフォルトとして自動的に使用されますが、現在セクション リストにない日付を使用する場合、たとえば 2010 年 4 月 (現在、リストには 5 月と 6 月)、これは次のようになります。正しく表示されません。アプリを終了して再度起動すると、新しいセクション ヘッダーが表示され、すべて問題ありません。

そのため、どういうわけかリストを更新または更新できる必要があります。コンテキストに追加して変更するだけでは、更新されないようです。

繰り返しますが、それが NSFetchedResultsController オブジェクトまたは UITableViewController である場合、何を更新する必要があるかわかりません。

更新#1:

このメソッドには例外があると思いました:

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

}

これは私がデータを移動する場所です:

- (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];
            // Reloading the section inserts a new row and ensures that titles are updated appropriately.
            [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }

}

このメソッドは、Apple の CoreDataBooks の例からほとんど取られています。そして、これはエラーです:

重大なアプリケーション エラーです。-controllerDidChangeContent: の呼び出し中に、NSFetchedResultsController のデリゲートから例外がキャッチされました。*** -[NSMutableArray removeObjectAtIndex:]: userInfo (null) の範囲 [0 .. 0] を超えるインデックス 1

その後、編集モード (削除ボタンが表示される場所) が機能しなくなります。

ありがとう。

4

3 に答える 3

15

わかりました、解決策を見つけたようです。これらはスキップします

[self.tableView beginUpdates];
[self.tableView endUpdates];

そして常にこれを行います。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{

[self.tableView reloadData];

}

以前に存在しないセクションにデータを移動したい場合にのみ問題が発生するため、明らかにこれにもう少しロジックを追加します。誰かが本当の解決策を教えてくれるまで、私はこれで行きます。

于 2010-06-19T23:55:17.920 に答える
2

バージョン 1.2 の iPhoneCoreDataRecipes での Apple による修正を採用し、適切なことは、

 // Reloading the section inserts a new row and ensures that titles are updated appropriately.
 [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];

    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

(FileMerge はあなたの友達です!)

バージョン 1.2 には、新しいエントリを作成する際の不規則なクラッシュを防ぐ別の修正があることに注意してください。私はこれを報告し、2 週間以内に修正されました。Apple にバグ レポートを提出することをお勧めします。彼らはあなたが思っているよりもはるかに反応が良く、可能な限り最高の修正を得ることが期待できます.

于 2010-10-04T14:18:38.190 に答える
0

controller:didChangeSection:atIndex:forChangeType:デリゲート メソッドを実装する必要があります。その中で、報告された変更の種類に応じて、、、およびメッセージをテーブル ビューに送信しinsertSections:withRowAnimation:ますdeleteSections:withRowAnimation:reloadSections:withRowAnimation:

于 2010-06-19T22:20:14.983 に答える