2

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

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

有任何想法吗?

4

1 回答 1

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

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

IB中的Segue Inspector Panel

然后在你的源视图控制器的 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];
    }
}
于 2014-07-09T00:46:34.373 回答