如何定位NSPopover

Tro*_*sen 1 cocoa nsoutlineview nsview nsviewcontroller nspopover

我有一个 OSX 应用程序,它使用 NSViewController 在我的 NSView 中交换输入输出视图。其中一种视图是 NSOutlineView。我现在想要在用户双击大纲视图中的一行时出现 NSPopover。目前我使用以下方法来显示弹出窗口:

NSRect theRect = [[NSApp keyWindow] convertRectFromScreen: NSMakeRect(700, 400, 5, 5)];
[myPopover showRelativeToRect: theRect // Window Coordinates
                        ofView: [[NSApp keyWindow] contentView]
                 preferredEdge: NSMinYEdge];
Run Code Online (Sandbox Code Playgroud)

这使得 NSPopover 出现在应用程序的底部。这有效,但我希望能够让弹出框正好出现在 NSOutlineView 的点击行下方。我交换进出的每个视图都由 NSViewController 控制,我想我可以使用 NSViewController 的 view 属性识别我的视图位置。但是,如果我替换[[NSApp keyWindow] contentView]myViewController.view我收到错误,即视图没有窗口并且 NSPopover 崩溃。显然,我遇到了麻烦 1) 在 NSView 中找到相对于主窗口的点击行的坐标 2) 理解为什么我的视图没有窗口。如果有人有可以帮助我理解这些问题的建议,我将不胜感激。

2013 年 6 月 2 日更新我仍在努力解决我的问题,但我发现如果我通过 MainWindowController (myControlledView) 访问其属性,我可以获得正确的视图坐标。然后当我询问视图的原点和框架大小时,我得到了正确的值。我的 VC 将自定义视图加载为 NIB 文件,当我询问加载视图的来源时,我得到 (0,0)。我认为即使我将视图作为 NIB 加载,视图相对于窗口的位置也会保持不变?我可以将视图原点传递给我的 VC,从而正确设置 NSPopover 但这看起来相当麻烦,我认为可以通过 VC 正确访问 NIB 加载的视图原点。

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);
Run Code Online (Sandbox Code Playgroud)

这导致:My origin: 0.000000 0.000000并且不是我正在寻找的,而这个:

NSLog(@"My origin: %f %f",self.myControlledView.frame.origin.x,self.myControlledView.frame.origin.y);
Run Code Online (Sandbox Code Playgroud)

结果在正确的来源: My origin: 176.000000 38.000000

显然,我不明白一些关于视图和窗口的内容。任何帮助都值得赞赏。

感谢您的建议和帮助!干杯,特隆

Tro*_*sen 5

一旦我明白我在做什么,结果就很容易了。事实证明,我的 currentViewController 有两个分配。一个在 IB 中分配,而一个在代码中分配。当我删除 IB 创建的 VC 时,我可以与正确的代码启动视图交互,并且我能够使用(跟踪)鼠标的位置来定位我的 NSPopover:

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

鼠标位置用于定义我的矩形的坐标:

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

[myPopover showRelativeToRect: theRect // Window Coordinates
                       ofView: [[NSApp keyWindow] contentView]
                preferredEdge: NSMaxXEdge];
Run Code Online (Sandbox Code Playgroud)

干杯,特隆