2015-02-11 23 views
19

Sto provando a scrivere un'applicazione temporizzata a finestra singola, in cui quando l'utente preme il pulsante di avvio, voglio che mostri un altro controller di visualizzazione con conto alla rovescia, ecc. Sto usando anche story board in Xcode , dove ho un seguito che collega il pulsante di avvio e il secondo controller di visualizzazione. Tuttavia, ci sono solo tre diversi stili: modale, foglio e pop-over. Voglio sostituire il primo controller della vista il secondo nella finestra. Non riesco a trovare un modo per farlo. Ho provato ad utilizzare uno stile personalizzato per i seguiti, e in questo uso presentViewController: animator: metodo ma non riesco a capire cosa inviare come argomento per l'animatore :.Transizione tra controller di visualizzazione, OS X

Qual è il modo più semplice/corretto per passare da un controller di visualizzazione all'altro in una finestra e viceversa?

Anche nello storyboard quando seleziono un controller di visualizzazione mostra un attributo chiamato "Presentazione" che può essere multiplo e singolo, che cosa rappresentano?

risposta

33

Penso che il modo più semplice è quello di scambiare contentViewController di NSWindow.

// in NSViewController's subclass 
@IBAction func someAction(sender: AnyObject) { 
    let nextViewController = ... // instantiate from storyboard or elsewhere 

    if let window = view.window where window.styleMask & NSFullScreenWindowMask > 0 { 
     // adjust view size to current window 
     nextViewController.view.frame = CGRectMake(0, 0, window.frame.width, window.frame.height) 
    } 

    view.window?.contentViewController = nextViewController 
} 

Questa è l'opzione n.

Se si desidera utilizzare il seguito, crearne uno personalizzato e impostarlo sulla classe seguito con identificatore in 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 
      } 
     } 
    } 
} 

Questa è l'opzione n.

L'ultima opzione utilizza presentViewController:animator: di NSViewController. Il codice seguente è personalizzato NSViewControllerPresentationAnimator per l'animazione di dissolvenza.

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 
      }) 
     }   
    } 
} 

Quindi presentare VC come questo.

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

di licenziamento, chiamare presentingViewController s' dismissViewController: nel VC presentato.

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

Spero che questo aiuto.

+1

Ho trovato che l'opzione 1 non funzionava in modalità schermo intero – jiminybob99

+0

@ jiminybob99 grazie per aver segnalato! Ho aggiornato la risposta. – bluedome

Problemi correlati