3

NSTableView私は`NSMutableArray でサポートしているビューベースを持っています。定期的にデータを取得し、新しい行をテーブルの一番上に挿入したいと考えています。

アニメーションを指定せずにこれを行うとinsertRowsAtIndexes:withAnimation:、何時間もうまくいくようです。ただし、アニメーションを指定すると、約 7 または 8 回の挿入の後、挿入が発生した場所に空白の行がテーブル ビューに表示され始めます。下にスクロールしてから上に戻ると、新しい行が適切にレンダリングされます。

呼び出すコードinsertRowsAtIndexes:withAnimationはブロック内にあり、メイン スレッドでは実行されませんが、挿入はメイン キューの dispatch_async 内で行われるため、マルチスレッドに関連しているとは思いません。

ここにいくつかのコードがあります...self.contentsは私のNSMutableArray.

 dispatch_async(dispatch_get_main_queue(), ^{
                [self.contentsTableView beginUpdates];
                if(posts.count) {
                    for(NSDictionary* dictionary in [posts reverseObjectEnumerator]) {
                        FNPost* post = [[FNPost alloc] initWithDictionary:dictionary width:self.contentsTableView.frame.size.width];
                        post.delegate = self;
                        [self.contents insertObject:post atIndex:0];
                        [self.contentsTableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:0] withAnimation: NSTableViewAnimationSlideLeft];
                    }
                }
                [self.contentsTableView endUpdates];

            });

私が混乱していることの1つは、AppleのNSTableViewドキュメントの次の部分ですinsertRowsAtIndexes:withAnimation

テーブル ビューの numberOfRows は、インデックスの数だけ自動的に減少します。

numberOfRowsInTableView:配列内のオブジェクトの数(したがって の結果)とテーブルビューが持っていると考える行の数との関係について、そのステートメントが何を意味するのか、私は混乱しています。私の考えでは、テーブルビューの行数は配列数と等しくなければならず、これについての私の理解が問題の根本にないことを確認したいのですが、アニメーションが指定されていない場合、テーブルは正常に機能します。

ここで明らかに間違ったことをしていますか?

4

1 に答える 1

1

この問題は、レイヤ ベースのビュー階層に NSTableView があることが原因であることが判明しました。2 つのスーパービューがあり、レイヤーに基づくビューがありました。NSTableView に関する他のいくつかの投稿を読んだ後、レイヤーに支えられた階層で他の誤った動作を示した後、IB でレイヤーをオフにすることにしました。ビュー間で CA トランジションを使用したい場合、層のバッキング状態を制御するために追加の状態を維持する必要があるという犠牲を払って、期待どおりにテーブル アニメーションが発生するようになりました。

于 2012-08-18T22:53:55.940 に答える