メニューバーのポップアップにNSTableViewを挿入しています。
テーブルビューとその内容に合わせて、ポップアップのパネルのサイズを変更したいと思います。たとえば、行がない場合、tableviewは非表示になります。新しい行を追加して、現在のテーブルビューの高さ+新しいセルの高さに基づいてパネルの高さを再計算しています。
セルを追加しています
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:0] withAnimation:NSTableViewAnimationSlideDown];
パネルの高さを次のように更新します。
[[self window] setFrame:panelRect display:YES animate:YES];
(すべて同じaddRowメソッド内)
これは正常に機能していますが、見た目は醜いです。テーブルビューとウィンドウは互いに別々にアニメーション化されています。私が欲しいのは、それらを同期し、テーブルビューの拡大と縮小と同時にウィンドウの境界線を移動することです。
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>
)
frame.size
キーパスを使用すると、同じ例外が発生します。を使用するとframe
、コールバックは返されません。
KVOでエラーが発生したり、ウィンドウのサイズ変更機能を使用してテーブルビューを実装するという別のアイデアが発生したりする可能性があります。