在插入带动画的新行后,基于视图的NSTableView呈现空白行

时间:2012-08-15 20:12:41

标签: cocoa core-animation nstableview grand-central-dispatch

我有一个基于视图的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];

            });

我感到困惑的一件事是NSTableView的{​​{1}}文档的一部分说:

  

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

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

我在这里做了一些明显错误的事吗?

1 个答案:

答案 0 :(得分:1)

此问题最终是由于在基于图层的视图层次结构中使用NSTableView引起的。两个超级视图,我有一个图层支持的视图。在阅读了有关NSTableView的其他帖子后,在层支持的层次结构中显示其他错误行为时,我决定关闭IB中的图层。表格动画现在按照我的预期发生,当我想在我的视图之间使用CA转换时,必须维持一些额外的状态来控制图层支持状态。