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

时间:2014-06-22 16:46:36

标签: objective-c macos nsviewcontroller nspopover

我在OS X 10.10应用程序中玩故事板。我有一个NSTableView,当您点击特定行时会打开一个包含NSViewController的弹出框的字段。

如何为弹出窗口指定箭头的原点NSPoint?现在,它只是指向中间的NSTableView。我认为我可以在prepareForSegue中执行此操作,但我似乎无法弄明白。 prepareForSegue似乎并不了解NSViewController

中包含的NSPopover

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

如果您认为应该以某种方式提供框架,则应该为此行为提交增强请求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

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

Segue Inspector Panel in IB

然后在源视图控制器的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];
    }
}