使用 NSViewController 在 osx 上切换视图控制器

Posted

技术标签:

【中文标题】使用 NSViewController 在 osx 上切换视图控制器【英文标题】:Switching view controller on osx with NSViewController 【发布时间】:2016-12-12 03:31:58 【问题描述】:

我的故事板上有一个带有加载栏的视图。当我的代码正在运行时,我希望加载栏继续。完成后,我想用按钮加载另一个视图控制器。

我通过加载一个新的视图控制器来尝试这个,但我不知道动画师是什么。这是我的代码。

我必须为动画师使用什么?我是不是把故事板的概念弄错了?

  override func viewDidAppear() 
    super.viewDidAppear()
    var deadlineTime = DispatchTime.now() + .seconds(1)
    progressView.style = NSProgressIndicatorStyle(rawValue: 0)!;
    progressView.startAnimation(self);
    DispatchQueue.main.asyncAfter(deadline: deadlineTime) 
        self.progressView.increment(by: 5)
        deadlineTime = DispatchTime.now() + .seconds(1)
        DispatchQueue.main.asyncAfter(deadline: deadlineTime) 
            deadlineTime = DispatchTime.now() + .seconds(1)
            self.progressView.increment(by: 10)
            DispatchQueue.main.asyncAfter(deadline: deadlineTime) 
                self.progressView.increment(by: 20)
                self.progressView.stopAnimation(self)
                //self.performSegue(withIdentifier: "bla", sender: self)
                self.switchScreen()
            
        
    



func switchScreen()
    let main = NSStoryboard(name: "Main", bundle: Bundle.main)
    let vc = self.storyboard?.instantiateController(withIdentifier: "finished") as! NSViewController
    self.presentViewController(vc, animator: ???)

【问题讨论】:

是 NSViewControllerPresentationAnimator 的子类 我明白了。但是我该如何启动呢?我如何使用现有的动画师。我必须创建一个吗? 我有类似的问题..你是怎么解决的? 我不需要这么多视图,所以我放了多个元素和一个视图。当我需要它们时,我会隐藏并展示它们。不过仍然会对更好的解决方案感兴趣...... 【参考方案1】:

要实现这一点,我们应该有自定义动画师。 请阅读苹果指南。

如果您想实现为模态窗口,请点击以下链接:

Transitioning between view controller, OS X

这是另一个实现:

Animate custom presentation of ViewController in OS X Yosemite

/* Presents the viewController with a specific animator that handles both the presentation and dismissal of the viewController. The animator is held onto until dismissViewController: is called. This is the fundamental primitive for displaying view controllers that block interaction in some way. The method will assert if animator is nil. In general, you will not directly call this method unless you have a custom animator. Instead, you will use one of the standard cover methods that provide the animator: 
[NSViewController presentViewControllerAsSheet:], [NSViewController presentViewControllerAsModalWindow:], [NSViewController presentViewController:asPopoverRelativeToRect:...]
    */    
 @available(OSX 10.10, *)
    open func present(_ viewController: NSViewController, animator: NSViewControllerPresentationAnimator)

【讨论】:

以上是关于使用 NSViewController 在 osx 上切换视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 NSViewController 在 OS X 上加载 nib

使用数据在 2 个不同的 NSViewController 之间切换

如何从 OS X 上的框架实例化 NSViewController(即获取正确的包)

preferredContentSize更改窗口大小在osx 10.12.6中不起作用

Cocoa:使用 nib 加载 NSViewController

在 NSWindow 中呈现不同 NSViewController 的正确方法