如何在启动时获得NSTableView的numberOfRows?

时间:2015-02-13 19:18:35

标签: objective-c cocoa

我有一个CoreData应用程序,NSArrayController绑定到NSTableView。我想在启动时使用scrollRowToVisible滚动到最后一行,但我遇到了问题。 要获取行数,我使用的是[myTable numberOfRows]。但是,我无法在代码中找到合适的位置以便在启动时使用它。程序运行后,我可以单击一个测试按钮,一切正常。

测试按钮代码(这确实有效):

  [myTableView scrollRowToVisible:[myTableView numberOfRows]-1];

我在几个地方使用了以下测试线,但我尝试的每个地方都得到0。

  NSLog(@"Number rows: %ld",[myTableView numberOfRows]);

对于我的大多数代码,我使用的是控制器与AppDelegate。我认为将这个放在我的控制器的awakeFromNib方法中会起作用,但是我得到0.我已经从AppDelegate的applicationDidFinishLaunching拨打了一个来自我控制器中的方法的电话 - 还是0。 所以我的问题是如何在启动时获得NSTableView的行数?

提前感谢您提出任何建议。

[编辑] ----

我尝试使用KVO,但我遗漏了一些东西。我在我的控制器init中有这个。

 [myArrayController addObserver:self forKeyPath:@"arrangedObjects"
        options:NSKeyValueObservingOptionInitial |
                NSKeyValueObservingOptionNew | 
                NSKeyValueObservingOptionOld
         Context:nil];

这在代码中:

  - (void)observeValueForKeyPath:(NSString *)keyPath
                           ofObject:(id)object
                           change:(NSDictionary *)change
                           context:(void *)context
      {  NSLog(@"It worked");  }

"它起作用了#34;永远不会显示,所以出了点问题。

2 个答案:

答案 0 :(得分:0)

NSArrayController使用Core Data延迟提取直到下一轮运行循环。

您可以使用计时器dispatch_after()-performSelector:withObject:afterDelay:将其延迟一段任意时间来推迟自己的代码。但是,这对我来说似乎有点迟钝。

您可以使用键值观察来观察阵列控制器的arrangedObjects属性。当更改时,取消注册您的观察(因为您只对第一次更改感兴趣)并提交延迟任务以滚动表格视图。您需要推迟滚动操作,因为您无法判断表格视图的约束是否已收到您所回复的arrangedObjects相同更改的通知,因此您不必#39;知道它是否已添加行。您可以使用dispatch_async(dispatch_get_main_queue(), ...)推迟它(没有任何延迟间隔)。

答案 1 :(得分:0)

您想将其放在其中一个视图方法中。你能在viewDidAppear中试试吗?