我在OS X 10.10应用程序中玩故事板。我有一个NSTableView
,当您点击特定行时会打开一个包含NSViewController
的弹出框的字段。
如何为弹出窗口指定箭头的原点NSPoint
?现在,它只是指向中间的NSTableView
。我认为我可以在prepareForSegue
中执行此操作,但我似乎无法弄明白。 prepareForSegue
似乎并不了解NSViewController
NSPopover
有什么想法吗?
答案 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一样):
然后在源视图控制器的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];
}
}