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

时间:2016-03-19 00:07:19

标签: macos cocoa storyboard

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

我是否有办法实现这一目标而无需重新构建故事板以将这些视图控制器嵌入到单独的窗口控制器中(这似乎会破坏故事板提供的灵活性的目的)?

1 个答案:

答案 0 :(得分:13)

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

view controller presentation attribute

不确定这是最好的方法,但在推动segue的NSViewController中,您可以为目标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

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

乔恩