2015-02-11 10 views
19

Ich versuche, eine einzelne Fenster-Timer-Anwendung zu schreiben, wo, wenn der Benutzer die Starttaste drückt, ich möchte es einen anderen View-Controller mit Countdown anzeigen usw. Ich verwende auch Storyboard in Xcode , wo ich einen Übergang habe, der den Startknopf und den zweiten Ansichtcontroller verbindet. Es gibt jedoch nur drei verschiedene Stile, d. H. Modal, Sheet und Pop-Over. Ich möchte den ersten View-Controller durch den zweiten im Fenster ersetzen. Ich kann keinen Weg finden, das zu tun. Ich habe versucht, einen benutzerdefinierten Stil für das Segment, und in diesem verwenden presentViewController: animator: -Methode, aber ich kann nicht herausfinden, was als Argument für den Animator zu senden:.Übergang zwischen View-Controller, OS X

Was ist der einfachste/richtige Weg, um von einem View-Controller zum anderen in einem Fenster zu wechseln und umgekehrt?

Auch im Storyboard, wenn ich einen View-Controller auswähle, zeigt es ein Attribut namens "Presentation", das mehrere und einzelne sein kann, was repräsentieren diese?

Antwort

33

Ich denke, der einfachste Weg ist das Austauschen contentViewController von 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 
} 

Dies ist Option # 1.

Wenn Sie segue verwenden möchten, erstellen Sie ein benutzerdefiniertes Profil und legen Sie es fest, um die Klasse mit ID in IB zu segeln.

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

Dies ist Option # 2. Die letzte Option verwendet presentViewController:animator: von NSViewController. Der folgende Code ist benutzerdefiniert für die Auflösung Animation.

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

Dann präsentieren VC wie folgt.

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

Für Entlassung, rufen presentingViewController ‚s dismissViewController: im dargestellten VC.

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

Hoffe diese Hilfe.

+1

Ich habe festgestellt, dass Option 1 nicht im Vollbildmodus funktioniert – jiminybob99

+0

@ jiminybob99 danke für die Berichterstattung! Ich habe die Antwort aktualisiert. – bluedome