1

我有一个 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

显然,我不了解有关视图和窗口的内容。任何帮助都将不胜感激。

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

4

1 回答 1

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];
}

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

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 回答