0

• 我的总体目标

我的目标是

  1. 在基于视图的 Table View 中加载一些数据并执行一些操作(用于 Table View 的显示)
  2. 在加载结束时滚动到表格视图的顶部。

• 更多细节

在加载过程中,会执行很多操作。更准确地说,表格视图是基于视图的,并且在每一行中,都有一个文本视图,其内容绑定到某个属性。实现了委托方法- (void)textDidChange:(必要时放大文本视图)。出于同样的目的,我还NSTextView对方法进行了子类化和覆盖。- (void)setString:

因此,当文本加载到 Table View 的行时,会执行很多操作。

• 编码

我的代码适用于afterDelay:0(滚动到顶部发生)但并非没有。

// works
- (void)updateTheController
{
    [super updateTheController] ;
    self.theCollectionView.representedObject = self.representedObject ;
    [self.theCollectionView performSelector:@selector(goToTop) 
                                 withObject:nil 
                                 afterDelay:0] ;
}

// does not work
- (void)updateTheController
{
    [super updateTheController] ;
    self.theCollectionView.representedObject = self.representedObject ;
    [self.theCollectionView goToTop] ;
}

• 我的问题

我想知道是否有更好的解决方案或解释。我记得一些东西,CATransaction但我不知道它是否可以在这里工作,而且我不记得要调用哪个方法(以及为什么)[CATransaction commit],,[CATransaction commit]

我的问题可能是:我可以用什么替换afterDelay:0,为什么需要它?

谢谢!!

4

2 回答 2

1

你所经历的必须是如何执行命令和结果,尤其是关于 KVO 的结果,这些在当前运行循环完成后可用。在您的情况下,点符号self.theCollectionView.representedObject = self.representedObject ;隐藏了一个 KVO 调用,setRepresentedObject:该调用会自动包含在willChangeValueForKey:didChangeValueForKey:调用中。这可能更好地解释了为什么新的表示对象以及新的视图内容在您运行命令时不可用,但只有在运行循环完成后才可用(解释更复杂!)。

因此,afterDelay:在当前运行循环完成后执行命令,然后才能填充视图并且可以到达顶部。这有时会很烦人,因为它似乎破坏了逻辑流程。然而,它是绝对有效的。

于 2014-06-04T11:26:24.773 回答
-1

您可以使用 GCD:

- (void)updateTheController
{
    [super updateTheController] ;
    self.theCollectionView.representedObject = self.representedObject;
    dispatch_async(dispatch_get_main_queue(), ^(){
        [self.theCollectionView goToTop];
    });
}

[self.theCollectionView goToTop];将被推入队列并尽快执行。

于 2014-03-18T11:21:41.420 回答