NSViewController を使用して NSView のインアウト ビューを交換する OSX アプリケーションがあります。ビューの 1 つは NSOutlineView です。ユーザーが Outlineview の行をダブルクリックしたときに NSPopover を表示させたいと考えています。現在、ポップオーバーを表示するには、次のアプローチを使用しています。
NSRect theRect = [[NSApp keyWindow] convertRectFromScreen: NSMakeRect(700, 400, 5, 5)];
[myPopover showRelativeToRect: theRect // Window Coordinates
ofView: [[NSApp keyWindow] contentView]
preferredEdge: NSMinYEdge];
これにより、アプリの下部に NSPopover が表示されます。これは機能しますが、ポップオーバーを NSOutlineView のクリックされた行の真下に表示できるようにしたいと考えています。入れ替えるすべてのビューは NSViewController によって制御され、NSViewController のビュー プロパティを使用してビューの位置を識別できると考えました。ただし、に置き換える[[NSApp keyWindow] contentView]
とmyViewController.view
、ビューにウィンドウがなく、NSPopover がクラッシュするというエラーが表示されます。明らかに、私は問題を抱えています 1) NSView でクリックされた行のメイン ウィンドウに対する座標を見つける 2) ビューにウィンドウがない理由を理解する。これらの問題を理解するのに役立つ提案があれば、大いに感謝します。
UPDATE 06/02/2013 私はまだ問題に苦しんでいますが、MainWindowController (myControlledView) を介してビューのプロパティにアクセスすると、ビューの正しい座標を取得できることがわかりました。次に、ビューの原点とフレーム サイズを尋ねると、正しい値が得られます。私のVCはカスタムビューをNIBファイルとしてロードし、ロードされたビューの原点を尋ねると(0,0)を取得します。ビューをNIBとしてロードしても、ウィンドウに対するビューの位置は変わらないと思いましたか? ビューの起点を VC に渡して NSPopover を正しく設定することはできますが、これはやや面倒で、NIB がロードされたビューの起点には VC を介して正しくアクセスできると思います。
managingViewController *vc = [viewControllers objectAtIndex:[viewIndex intValue]];
[self.currentViewController.view removeFromSuperview];
[self setCurrentViewController:vc];
[self.myControlledView addSubview:vc.view];
NSLog(@"My origin: %f %f",vc.view.frame.origin.x,vc.view.frame.origin.y);
これは結果に:My origin: 0.000000 0.000000
なり、私が探しているものではありませんが、これは次のとおりです。
NSLog(@"My origin: %f %f",self.myControlledView.frame.origin.x,self.myControlledView.frame.origin.y);
正しい原点が得られます。My origin: 176.000000 38.000000
明らかに、私が理解していないビューとウィンドウについて何かがあります。どんな助けでも大歓迎です。
提案と助けをありがとう!乾杯、トロンド