我有一个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;永远不会显示,所以出了点问题。
答案 0 :(得分:0)
NSArrayController
使用Core Data延迟提取直到下一轮运行循环。
您可以使用计时器dispatch_after()
或-performSelector:withObject:afterDelay:
将其延迟一段任意时间来推迟自己的代码。但是,这对我来说似乎有点迟钝。
您可以使用键值观察来观察阵列控制器的arrangedObjects
属性。当更改时,取消注册您的观察(因为您只对第一次更改感兴趣)并提交延迟任务以滚动表格视图。您需要推迟滚动操作,因为您无法判断表格视图的约束是否已收到您所回复的arrangedObjects
相同更改的通知,因此您不必#39;知道它是否已添加行。您可以使用dispatch_async(dispatch_get_main_queue(), ...)
推迟它(没有任何延迟间隔)。
答案 1 :(得分:0)
您想将其放在其中一个视图方法中。你能在viewDidAppear中试试吗?