我有一个 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];
这使得 NSPopover 出现在应用程序的底部。这可行,但我希望能够让弹出框恰好出现在 NSOutlineView 的单击行下方。我换入换出的每个视图都由 NSViewController 控制,我认为我可以使用 NSViewController 的 view 属性来识别我的视图位置。但是,如果我替换[[NSApp keyWindow] contentView]
为myViewController.view
我收到视图没有窗口并且 NSPopover 崩溃的错误。显然,我遇到了麻烦 1)在 NSView 中找到单击行相对于主窗口的坐标 2)理解为什么我的视图没有窗口。如果有人有可以帮助我理解这些问题的建议,我将不胜感激。
更新 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
显然,我不了解有关视图和窗口的内容。任何帮助都将不胜感激。
感谢您的建议和帮助!干杯,特隆德