0

したがって、私はこのことをほとんど理解していますが、テーブルを検索した後に入力された詳細ビューから managedObjectContext を更新すると、NSFetchedResultsChangeUpdate につまずいています。

コア データ セットから生成されたテーブルビューがあります。このテーブルから詳細ビューに入り、問題なく変更を加えることができます。また、テーブルを検索して、ほとんどの場合問題なく変更を加えることができます。ただし、特定のオブジェクトでは、「コア データの変更処理中に例外がキャッチされました」というメッセージが表示されます。

これを NSFetchedResultsChangeUpdate まで追跡しました。私は次のコードを使用しています:

case NSFetchedResultsChangeUpdate:
if (searchTermForSegue)
{
NSLog(@"index info:%@.....",theIndexPath);
NSLog(@"crashing at the next line");
[self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
break;
} else {
[self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath]; }
break;

テーブルが検索されていないときは、else メソッドが実行され、100% の確率で機能します。テーブルが検索されると、if (searchTermForSegue) が実行され、ほとんどの場合は機能しますが、常に機能するとは限りません。私は theIndexPath をログに記録し、次のことを発見しました。

機能する場合、theIndexPath はオブジェクト indexPat を正しく報告しています。失敗した場合、間違った theIndexPath が呼び出されています。たとえば、tableView を 3 つのセクションに絞り込む検索を実行すると、1 番目に 2 項目、2 番目に 1 項目、3 番目に 1 項目、次の nslog が得られます。

On first object: index info:<NSIndexPath 0xb0634d0> 2 indexes [0, 0].....
on second object: index info:<NSIndexPath 0xb063e70> 2 indexes [0, 1].....
on third object: index info:<NSIndexPath 0xb042880> 2 indexes [1, 0].....
but on the last object: index info:<NSIndexPath 0x9665790> 2 indexes [2, 17]..... 

[2, 0] を呼び出す必要があります

これらのオブジェクトを削除したり、新しいオブジェクトを追加したりするのではなく、単純にこれらのオブジェクトを更新していることに注意してください。

どんな考えでも大歓迎です!

4

1 に答える 1

-1

さて、問題を解決するハックを見つけましたが、問題を解決する最善の方法とは思えません! 何かご意見は?

NSFetchedResultsChangeUpdate がベース テーブルから呼び出されたときに、1 回だけ呼び出されたことがわかりましたが、検索/フィルター処理されたテーブルから呼び出されたときに、2 回呼び出されました (一見 100% の時間 - これは検索されたテーブルの両方を更新するためだと思います)。および非検索テーブル?)。さらに、最初の呼び出しには常に正しくない indexPath が含まれているように見えましたが、2 番目の呼び出しには正しい情報が含まれていました。不適切な indexPath が範囲外の場合、最初の呼び出しでアプリがクラッシュしていました。

私の「修正」は、次のようにして、検索されたテーブルから NSFetchedResultsChangeUpdate の場合、最初の呼び出しを無視することでした

tableview.h ファイルのインターフェースへの追加:

int             changeCall;

次に、tableview.m ファイルの loadView で:

changeCall = 0;

次に、NSFetchedResultsChangeUpdate を次のように更新しました。

case NSFetchedResultsChangeUpdate:
        if (searchTermForSegue)
        {
            if (changeCall == 0) {
                changeCall++;
                break;
            } else if (changeCall == 1){
                NSLog(@"index infocalledtwice:%@.....",theIndexPath);
                [self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
                changeCall = 0;
                break;
            } else { break; }
        } else {
            [self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
        }
        break;

基本的に、changeCall int を使用して、検索されたテーブルの更新で最初の呼び出しをスキップし、2 番目の呼び出しを使用して実際にコンテンツを更新します。これはこの問題を解決する最善の方法ではありませんが、絆創膏はうまくいくようです. 誰かがより良い答えを持っていれば、私は確かに感謝します。

さらに、最初の NSFetchedResultsChangeUpdate をスキップすることにより、検索されていないテーブルは更新されず、新しい値が反映されません。searchDisplayControllerWillEndSearch メソッドにテーブルをリロードする呼び出しを追加して、これを修正しました。

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    [self setSearchTermForSegue:nil];
    [self.tableView reloadData];
}

ありがとう!

于 2012-06-04T15:01:00.303 に答える