2015-02-11 63 views
19

我想寫一個窗口計時器應用程序,其中當用戶按下開始按鈕時,我希望它顯示另一個視圖控制器倒計時等。我也在Xcode中使用故事板,我有一個連接開始按鈕和第二個視圖控制器的segue。但是,只有三種不同的風格,即模式,表單和彈出式廣告。我想在窗口中替換第一個視圖控制器。我找不到這樣做的方法。我嘗試使用自定義風格的segue,並在那使用presentViewController:animator:方法,但我不知道要發送什麼作爲動畫的參數:。視圖控制器之間的轉換,OS X

在一個窗口中從一個視圖控制器轉換到另一個視圖控制器的最簡單/正確的方式是什麼?反之亦然?

同樣在故事板中,當我選擇一個視圖控制器時,它顯示了一個名爲「Presentation」的屬性,它可以是多個單一的,它們代表什麼?

回答

33

我認爲最簡單的方法就是交換contentViewControllerNSWindow

​​

這是選項#1。

如果要使用segue,請創建自定義的一個,並將其設置爲在IB中標識具有標識符的類。

class ReplaceSegue: NSStoryboardSegue { 
    override func perform() { 
     if let fromViewController = sourceController as? NSViewController { 
      if let toViewController = destinationController as? NSViewController { 
       // no animation. 
       fromViewController.view.window?.contentViewController = toViewController 
      } 
     } 
    } 
} 

這是選項#2。

最後一個選項是使用presentViewController:animator:NSViewController。下面的代碼是自定義NSViewControllerPresentationAnimator溶解動畫。

class ReplacePresentationAnimator: NSObject, NSViewControllerPresentationAnimator { 
    func animatePresentationOfViewController(viewController: NSViewController, fromViewController: NSViewController) { 
     if let window = fromViewController.view.window { 
      NSAnimationContext.runAnimationGroup({ (context) -> Void in 
       fromViewController.view.animator().alphaValue = 0 
      }, completionHandler: {() -> Void in 
       viewController.view.alphaValue = 0 
       window.contentViewController = viewController 
       viewController.view.animator().alphaValue = 1.0 
      }) 
     } 
    } 

    func animateDismissalOfViewController(viewController: NSViewController, fromViewController: NSViewController) { 
     if let window = viewController.view.window { 
      NSAnimationContext.runAnimationGroup({ (context) -> Void in 
       viewController.view.animator().alphaValue = 0 
       }, completionHandler: {() -> Void in 
        fromViewController.view.alphaValue = 0 
        window.contentViewController = fromViewController 
        fromViewController.view.animator().alphaValue = 1.0 
      }) 
     }   
    } 
} 

然後提出這樣的VC。

@IBAction func replaceAction(sender: AnyObject) { 
    let nextViewController = ... // instantiate from storyboard or elsewhere 
    presentViewController(nextViewController, animator: ReplacePresentationAnimator()) 
} 

解僱,叫presentingViewControllerdismissViewController:所呈現的VC。

@IBAction func dismissAction(sender: AnyObject) { 
    presentingViewController?.dismissViewController(self)  
} 

希望得到這個幫助。

+1

我發現選項1沒有在全屏模式下工作 – jiminybob99 2016-09-22 17:32:23

+0

@ jiminybob99感謝您的舉報!我更新了答案。 – bluedome 2016-09-26 07:08:52