2016-03-19 39 views
1

現在我有一個OS X故事板應用程序,它有一個主窗口和一個按鈕,可以觸發另一個視圖控制器的「顯示」繼續。現在我已經將segue設置爲模態,因爲如果我不這樣做,用戶可以再次單擊相同的按鈕,並最終獲得同一窗口的兩個副本。OS X故事板:使用「show」segue而不允許重複的新窗口顯示?

有沒有一種方法可以讓我在不需要重構故事板的情況下將這些視圖控制器嵌入到單獨的窗口控制器中(這似乎會破壞故事板提供的靈活性的目的)呢?

回答

8

編輯:雖然下面的答案確實有效,但確實是不是最好的方法。在故事板中,選擇目標視圖的視圖控制器,然後轉到屬性檢查器並將演示文稿從多個更改爲單個。就是這樣,不需要代碼。

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 

當您關閉包含目標視圖控制器的窗口,這將設置原始視圖控制器到pushedViewController財產無,所以如果窗口尚未打開,則繼續執行。再次,可能有更好的方法來做到這一點。希望這可以幫助。

Jon

+1

我一直在想「什麼是演示文稿」設置。非常感謝! – Aaron

+0

謝謝;這是我需要的。另外一個轉折:你必須在你的賽格的目標上設置演示文稿。如果您使用ViewController開箱即用,您需要設置_it's_ presentation;如果你分配一個WindowController,你需要設置它。 –