你如何在 OS X 10.10 故事板的 popover segue 上指定箭头的原点

Jos*_*row 2 macos objective-c nsviewcontroller nspopover

我在 OS X 10.10 应用程序中玩故事板。我有一个NSTableView,当您单击特定行时会打开一个转场,该转场会转到包含NSViewController.

你如何指定NSPoint弹出框的箭头原点?现在,它只是指向NSTableView中间。我以为我可以在 中做到这一点prepareForSegue,但我似乎无法弄清楚。 prepareForSegue似乎没有理解NSViewController包含在NSPopover

有任何想法吗?

Tay*_*lor 5

如果您认为框架应以某种方式提供此行为,则应针对此行为提交增强请求 Radar。


但要同时解决此问题,您可以创建自己的自定义 NSStoryboardSegue 子类来帮助解决此问题。

@interface TablePopoverSegue : NSStoryboardSegue

@property (weak) NSTableView *anchorTableView;
@property NSRectEdge preferredEdge;
@property NSPopoverBehavior popoverBehavior;

@end

@implementation TablePopoverSegue

- (void)perform {
    if ([self anchorTableView]) {
        NSInteger selectedColumn = [[self anchorTableView] selectedColumn];
        NSInteger selectedRow = [[self anchorTableView] selectedRow];

        // If we can pick a specific row to show from, do that; otherwise just fallback to showing from the tableView
        NSView *anchorView = [self anchorTableView];
        if (selectedRow >= 0) {
            anchorView = [[self anchorTableView] viewAtColumn:selectedColumn row:selectedRow makeIfNecessary:NO];
        }

        // Use the presentation API so that the popover can be dismissed using -dismissController:.
        [[self sourceController] presentViewController:[self destinationController] asPopoverRelativeToRect:[anchorView bounds] ofView:anchorView preferredEdge:[self preferredEdge] behavior:[self popoverBehavior]];
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

这可以在转场的检查器面板中的 IB 中指定(就像 iOS 一样):

IB 中的 Segue Inspector 面板

然后在你的源视图控制器的 prepareForSegue: 中,你可以设置 segue:

- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
    if ([segue isKindOfClass:[TablePopoverSegue class]]) {
        TablePopoverSegue *popoverSegue = (TablePopoverSegue *)segue;
        popoverSegue.preferredEdge = NSMaxXEdge;
        popoverSegue.popoverBehavior = NSPopoverBehaviorTransient;
        popoverSegue.anchorTableView = [self tableView];
    }
}
Run Code Online (Sandbox Code Playgroud)