1

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

明らかに、私が理解していないビューとウィンドウについて何かがあります。どんな助けでも大歓迎です。

提案と助けをありがとう!乾杯、トロンド

4

1 に答える 1

5

自分が何をしているのかを理解するとすぐに、これは非常に簡単であることがわかりました。currentViewController が 2 つ割り当てられていることがわかりました。1 つは IB に割り当てられ、もう 1 つはコードに割り当てられました。IB で作成された VC を削除すると、正しいコードで開始されたビューと対話でき、(追跡された) マウスの位置を使用して NSPopover を配置できました。

-(void)mouseMoved:(NSEvent *)theEvent {
    NSPoint p = theEvent.locationInWindow;
    self.myMouseX=[NSNumber numberWithFloat:p.x];
    self.myMouseY=[NSNumber numberWithFloat:p.y];
}

マウスの位置は、rect の座標を定義するために使用されました。

NSRect theRect = NSMakeRect([self.myMouseX floatValue] + 5,[self.myMouseY floatValue],1,1);

[myPopover showRelativeToRect: theRect // Window Coordinates
                       ofView: [[NSApp keyWindow] contentView]
                preferredEdge: NSMaxXEdge];

乾杯、トロンド

于 2013-02-19T16:39:58.760 に答える