OS X故事板:使用"show"segue而不允许显示重复的新窗口?

Aar*_*ron 2 macos cocoa storyboard

现在我有一个OS X故事板应用程序,它有一个主窗口,上面有一个按钮,触发另一个视图控制器的"show"segue.现在我已经将segue设置为模态,因为如果我不这样做,用户可以再次单击相同的按钮,最后得到同一窗口的两个副本.

有没有办法让我完成这个,而不必重新构建故事板,将这些视图控制器嵌入一个单独的窗口控制器中(这似乎会破坏故事板提供的灵活性的目的)?

Jon*_*Jon 15

编辑:虽然下面的答案确实有效,但绝对不是最好的方法.在故事板中,选择目标视图的视图控制器,然后转到属性检查器并将演示文稿从多个更改为单个.就是这样,不需要代码.

视图控制器表示属性


不确定这是最好的方法,但是在NSViewController推送segue时,您可以为目标添加属性,NSViewController并在您的prepareForSegue:sender:方法中分配目标视图控制器.最后,在该shouldPerformSegueWithIdentifier:sender:方法中,检查目标视图控制器是否已分配,如果是,则将其窗口置于前面并返回NO含义不执行segue,否则返回YES.这是一个快速示例(包含在NSViewController按钮中以启动segue):

@interface ViewController ()
@property (weak) NSViewController *pushedViewController;
@end

@implementation ViewController

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if (self.pushedViewController) {
        [self.pushedViewController.view.window makeKeyAndOrderFront:self];
        return NO;
    }
    return YES;
}

- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
    self.pushedViewController = segue.destinationController;
}

@end
Run Code Online (Sandbox Code Playgroud)

当您关闭包含目标视图控制器的窗口时,这会将原始视图控制器的pushViewController属性设置为nil,因此如果窗口尚未打开,则segue将执行.同样,可能有更好的方法来做到这一点.希望这可以帮助.

乔恩