我在 OS X 10.10 应用程序中玩故事板。我有一个NSTableView
,当您单击特定行时,会打开一个 segue,该 segue 会转到包含NSViewController
.
你如何指定NSPoint
弹出框箭头的原点?现在,它只是指向NSTableView
中间。我以为我可以在 中做到这一点prepareForSegue
,但我似乎无法弄清楚。 prepareForSegue
似乎不理解NSViewController
包含在NSPopover
有任何想法吗?
我在 OS X 10.10 应用程序中玩故事板。我有一个NSTableView
,当您单击特定行时,会打开一个 segue,该 segue 会转到包含NSViewController
.
你如何指定NSPoint
弹出框箭头的原点?现在,它只是指向NSTableView
中间。我以为我可以在 中做到这一点prepareForSegue
,但我似乎无法弄清楚。 prepareForSegue
似乎不理解NSViewController
包含在NSPopover
有任何想法吗?
如果您认为框架应该以某种方式提供此行为,您应该为此行为提交增强请求 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 一样):
然后在你的源视图控制器的 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];
}
}