Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSTableView';文档视图大小观察_Cocoa_Nstableview_Key Value Observing_Nsscrollview - Fatal编程技术网

Cocoa NSTableView';文档视图大小观察

Cocoa NSTableView';文档视图大小观察,cocoa,nstableview,key-value-observing,nsscrollview,Cocoa,Nstableview,Key Value Observing,Nsscrollview,我正在菜单栏弹出窗口中插入NSTableView 我想调整弹出窗口面板的大小,使其适合tableview的内容。例如,如果没有行,则隐藏tableview。通过添加新行,我将根据当前tableview高度+新单元格高度重新计算面板高度 我正在添加带有 [self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:0] withAnimation:NSTableViewAnimationSlideDown]; 并使用以下内容更

我正在菜单栏弹出窗口中插入NSTableView

我想调整弹出窗口面板的大小,使其适合tableview的内容。例如,如果没有行,则隐藏tableview。通过添加新行,我将根据当前tableview高度+新单元格高度重新计算面板高度

我正在添加带有

[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:0] withAnimation:NSTableViewAnimationSlideDown];
并使用以下内容更新面板的高度:

[[self window] setFrame:panelRect display:YES animate:YES];
(都在相同的addRow方法中)

这很好,但看起来很难看-tableview和window分别设置动画。我只想同步它们,在tableview增长和收缩的同时移动窗口的边框

根据我的iOS开发经验,我有一个想法——观察tableview的contentSize,但我没有做到:

- (void)awakeFromNib
{
    [super awakeFromNib];
    ...
    [self.scrollView.documentView addObserver:self forKeyPath:@"bounds.size" options:NSKeyValueObservingOptionNew context:NULL];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"!");
}
self.scrollview
链接到IB中tableview的容器scrollview。该代码导致异常:

An instance 0x10053a1d0 of class NSConcreteValue was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x10053c850> (
<NSKeyValueObservance 0x10053c7a0: Observer: 0x10053a160, Key path: size, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x10053c880>
)
NSConcreteValue类的实例0x10053a1d0在键值观察器仍向其注册时被解除分配。观测信息被泄露,甚至可能被错误地附加到其他物体上。在NSKVODeallocateBreak上设置断点,使其在调试器中停止。以下是当前的观察信息:
(
)
使用
frame.size
keypath会导致相同的异常。仅使用
frame
不会返回回调

如果有任何导致我在KVO中出现错误的原因,或者有其他想法使用窗口调整功能实现tableview,我将不胜感激

  • 边界和框架是C类型的结构,而不是对象
  • 尽管Cocoa会自动使用NSValue包装边界和帧,但NSRect不会包装NSSize
  • 更改通知将由setXXX函数触发。尝试添加一个按钮,并按如下方式编写操作:

    [self.scrollView.documentView setBounds:NSMakeRect(0,0,100,100)]


  • 可能无法解决设置动画的问题。但是,在释放对象之前,应该从对象中移除观察者。这将使例外消失。i、 e在这种情况下,你应该

    [self.scrollView.documentView removeObserver:self-forKeyPath:@“bounds.size”]

    这应该在self.scrollView.documentView耗尽内存之前完成。 考虑到这可能很棘手,您可以尝试添加如下观察者:

    [self-addObserver:self-forKeyPath:@“self.scrollView.documentView.bounds.size”选项:NSKeyValueObservingOptionNew-context:Nil]

    另一件事,我记得在某个地方读到的是,观察框架或边界,通常被认为不是一个好主意,但我不确定这一点

    编辑:考虑其他答案:“
    bounds.size
    ”不起作用,因为
    size
    不是使用任何setter方法直接设置的。因此,相反,观察帧并从中提取大小信息。
    (对于UIView,只有帧是可观察的,而不是边界。我想这同样适用于NSView)

    感谢您的解释,但这并不是我问题的解决方案。我已经使用了
    removeObserver
    。但它似乎在错误的地方。第二行不行。我认为@Chen Hai的回答是对此的一种解释。@EvgenyAleksandrov:你得到这个例外的原因可能就是Chen Hai告诉你的原因。但是将
    bounds.size
    更改为仅
    frame
    会起作用,并且会触发方法
    observeValueForKeyPath:…
    。我想你可以从中提取尺寸信息。另外,如果你把第二个选项改为仅帧,它也可以工作。我试过了。
    [self.scrollView.documentView removeObserver:self forKeyPath:@"frame"]
    
    [self addObserver:self forKeyPath:@"self.scrollView.documentView.frame" options:NSKeyValueObservingOptionNew context:Nil];