本文介绍了在视图控制器,OS X之间转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想写一个单一的窗口计时器应用程序,当用户按下开始按钮我想它显示另一个视图控制器倒计时等。我也使用故事板在Xcode,我有一个segue其连接开始按钮和第二视图控制器。然而,只有三种不同的风格,即模态,表格和弹出。我想替换第一个视图控制器第二个在窗口中。我找不到办法。我试图使用自定义样式为segue,并在使用presentViewController:animator:方法,但我不知道什么作为动画的参数:。

I am trying to write a single window timer application, where when the user presses the start button I want it to show another view controller with countdown etc. I'm also using story board in Xcode, where I have got a segue which connects the start button and the second view controller. However, there are only three different styles i.e. modal, sheet, and pop-over. I want to replace the first view controller the second one in the window. I cannot find a way to do that. I tried using a custom style for the segue, and in that use presentViewController: animator: method but I cannot figure out what to send as the argument for the animator:.

在一个窗口中从一个视图控制器转换到另一个视图控制器的最简单/正确的方法是什么?

What is the simplest/proper way to transition from one view controller to the other in one window and vice versa?

当我选择视图控制器时,在storyboard中显示一个名为Presentation的属性,它可以是多个和单个的,这些属性是什么?

Also in the storyboard when I select a view controller it shows an attribute called "Presentation" which can be multiple and single, what do those represent?

推荐答案

我认为最简单的方法是交换 NSWindow 的 contentViewController

I think the simplest way is that swapping contentViewController of 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
}

#1。

如果要使用segue,请创建自定义一个,并将其设置为IB中的标识符为segue类。

If you want to use segue, create custom one and set it to segue class with identifier 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
            }
        }
    }
}

这是选项#2。

最后一个选项是使用 presentViewController:animator: NSViewController 。下面的代码是用于溶解动画的自定义 NSViewControllerPresentationAnimator 。

Last option is using presentViewController:animator: of NSViewController. The code below is custom NSViewControllerPresentationAnimator for dissolve 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
            })
        }
    }
}

然后像这样显示VC。

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

希望有帮助。

这篇关于在视图控制器,OS X之间转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-14 13:53