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

            });

我感到困惑的一件事是AppleNSTableView文档的一部分insertRowsAtIndexes:withAnimation说:

表视图中的 numberOfRows 将自动减少索引计数。

我对该语句所暗示的关于我的数组中的对象数(以及因此的结果numberOfRowsInTableView:)与表视图认为它具有的行数之间的关系感到困惑。在我看来,表格视图中的行数应该等于我的数组计数,我想确保我对此的理解不是问题的根源,但就像我说的那样,如果没有指定动画,表格可以正常工作。

我在这里做明显错误的事情吗?

4

1 回答 1

1

事实证明,这个问题是由 NSTableView 在基于层的视图层次结构中引起的。两个superviews,我有一个layer-backed view。在阅读了一些关于 NSTableView 的其他帖子后,在层支持的层次结构中显示了其他错误行为,我决定关闭 IB 中的层。当我想在我的视图之间使用 CA 转换时,表格动画现在会按照我的预期发生,但代价是必须维护一些额外的状态来控制图层支持状态。

于 2012-08-18T22:53:55.940 回答