3

まず、これが回答されている場合は、心からお詫び申し上げます。私はあまりにも長い間これと戦ってきました。あらゆる種類の助けをいただければ幸いです。

さまざまな Web ソースからデータを非同期に取得し、それを解析して、メイン モデルで処理されるオブジェクトにするアプリケーションを開発しています。このモデルは、UITableView の情報を提供します。データを受信して​​解析したら、テーブル ビューのセクション数と行数を変更する必要があります。最初にセクションの数を決定するデータを受け取り、次に各セクションの行数とその内容を変更するデータを非同期に受け取ります。テーブル ビューのデータ ソースをセットアップしました。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.

    return [self.sijainti.pysakit count];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    //if ([[[self.sijainti.pysakit objectAtIndex:section] ajatStr] count] == 0) return 1;
    NSLog(@"ajatStr of section: %d  count: %d",section, [[[self.sijainti.pysakit objectAtIndex:section] ajatStr] count]);
    return [[[self.sijainti.pysakit objectAtIndex:section] ajatStr] count];
}

オブジェクト名はフィンランド語です (長い話)。numberOfRowsInSection の 2 行目は、デバッグを容易にするためにコメント化されました。現在、データは動的であるため、データを表示する準備ができたらインターフェイスを更新する必要があります。そうしないと、ユーザーはスクロールして元に戻るまでそれを知りません。私はこれのための方法を持っています:

- (void)updateRowWithCell:(SCPysakki *)valmisPysakki {
    if (!valmisPysakki.isInArray) return;

    int section = [self.sijainti.pysakit indexOfObject:valmisPysakki];

    [self.tableView beginUpdates];
    NSIndexSet *sectionSet = [NSIndexSet indexSetWithIndex:section];
    [self.tableView reloadSections:sectionSet withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView endUpdates];
}

これは、セクションの数が判明した後にのみ呼び出されます。効率とアニメーションのために reloadData を使用したくありません。私はこれを設定していたので、行だけがあり、行の中に行を描いていました。しかし、行が iPhone の画面よりも高くなると、タイトルが見えなくなり、非常にわかりにくくなりました。だから私はそれらをセクションにし、行は実際の行を描いた. すると、突然問題に直面しました。reloadRowsAtIndexPaths: withRowAnimation: は問題なく動作しましたが、 reloadSections: withRowAnimation: を使用すると、次の例外が発生しました。

* -[UITableView _endCellAnimationsWithContext:]、/SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 でのアサーションの失敗

2012-09-17 04:11:27.769 pysappi[2351:f803] *キャッチされない例外 'NSInternalInconsistencyException' によるアプリの終了、理由: '無効な更新: セクション 1 の行数が無効です。既存のセクションに含まれる行数更新後 (1) は、更新前にそのセクションに含まれていた行数 (0) に、そのセクションから挿入または削除された行数 (0 挿入、0 削除) をプラスまたはマイナスし、プラスまたはマイナスそのセクションに移動した、またはそのセクションから移動した行数 (移動した行数 0、移動した行数 0)。

update メソッドに [self.tableView endUpdate] と [self.tableView endUpdate] を追加することで、これを解消できました。しかし、いや、それは次の場合にのみ機能します。

  1. セクションの数を決定するデータを受け取った後、 reloadData を使用します(これにより、テーブルビューが短くなり、すべての更新後にテーブルの上部にあるユーザーが更新されます。reloadData を使用せずにセクションを動的に更新したい場合を除いて)セクションを削除するときですが、これを行おうとすると再び例外が発生します。)

  2. 1 行だけのデータを受信した後にセクションを更新します (そのため、すべてのデータを受信した後でセクション内のすべての行を更新しようとすると、再び例外が発生します)。

これにより、優れたユーザー インターフェイスを作成することが不可能になる状況が生じます。根底にある問題は開始と終了の更新呼び出しでは解決されないと確信していますが、それは非常に奇妙な理由で問題を解決するだけです。

また、insertRowsAtIndexPaths: を使用して手動で行を追加し、手動で更新しようとしましたが、これはまったく同じエラーを返します。長いデバッグの進行中に、 cellForRowAtIndexPath: が呼び出された後にこの例外が発生し、更新中に追加された新しい行の 1 つのセルが返されることを確認できました。また、これらのいくつかの状況が当てはまる場合、これが start および end 更新メソッドが行の更新を機能させる理由であると思います。

上で説明した以外で機能した唯一のことは、 reloadData のみを使用することですが、更新の量を考慮すると、それは事実上不可能です。

思ったより長くなり、午前4時30分。この例外のおかげで、こんなに遅くまで起きたのは初めてではありません。さらに情報が必要な場合は、お尋ねください。前もって感謝します。

4

1 に答える 1

0

(コメントで回答。コミュニティ wiki の回答に変換。回答のない質問を参照してください。ただし、コメントで問題が解決されています (またはチャットで拡張されています) )

@deleted_user さんが書きました:

更新後に既存のセクションに含まれる行数 (1) は、更新前にそのセクションに含まれる行数 (0) と等しくなければなりません。それを挿入物と見なさず、失敗しました

于 2015-02-03T17:16:32.753 に答える