【问题标题】:OS X storyboards: using "show" segue without allowing duplicate new windows to show?OS X 故事板:使用“显示”segue 不允许显示重复的新窗口?
【发布时间】:2016-03-19 00:07:18
【问题描述】:

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

有没有一种方法可以让我实现这一点,而不必重新构建故事板以将这些视图控制器嵌入到单独的窗口控制器中(这似乎违背了故事板提供的灵活性的目的)?

【问题讨论】:

    标签: macos cocoa storyboard


    【解决方案1】:

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


    不确定这是不是最好的方法,但是在推动 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 将执行。同样,可能有更好的方法来做到这一点。希望这会有所帮助。

    乔恩

    【讨论】:

    • 我一直想知道“演示”设置是干什么用的。非常感谢!
    • 谢谢;这就是我所需要的。另一个转折点:您必须将演示文稿设置在您的 segue 目标上。如果使用开箱即用的 ViewController,则需要设置 it's 表示;如果你分配一个 WindowController,你需要设置它。
    • @JoeySlomowitz 我不确定,但您为什么要这样做?使用故事板的目的是您无需代码即可免费获得所有功能。只需将按钮的操作连接到推送视图的Show 方法,将演示文稿设置为单个即可。有时呈现一个视图而有时呈现多个实例的用例是什么?
    • @Jon 我项目中的需求和基础设施设置为不使用情节提要,因此我需要一个程序化解决方案。
    • @JoeySlomowitz 这个问题和答案专门针对故事板的使用。如果您想在不使用情节提要的情况下推送窗口,只需在推送的窗口上调用makeKeyAndOrderFront:。如果这没有帮助,您应该发布一个问题,而不是在 cmets 中寻求这个答案。
    猜你喜欢
    • 2015-03-15
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多