替换Swift2 Storyboard MAC OSX下的NSViewController

tim*_*imv 4 macos xcode storyboard swift osx-elcapitan

我是Mac OSX的新手,并且Apple宣传代码正在变得相似的事实决定告诉民众我正在编写代码,因为我们应该能够制作Mac OSX版本.iPhone和iPad版本都很好,即将发布第二版,所以没有问题.

所以我将NSWindowController子类化以获取对工具栏的访问权,并研究如何在工具栏上删除和添加项目,但对于我的生活,我无法获得一个NSViewController(firstViewController)来解雇并调出第二个NSViewController(secondViewController)在同一NSWindowController中.

所以2个问题是1.我希望能够在代码中从第一个NSViewController执行SegueWithIdentifier,并且2.通过替换同一个NSWindowController中的第一个NSViewController来调出第二个NSViewController.

如果我向firstViewController添加一个按钮并将segue放到secondViewController然后当我选择按钮时,secondViewController就好了,但是在一个单独的窗口中,我想要它不同的NSWindowController并且firstViewController没有被替换但是保持在NSWindowController中.

所以我知道segue的想法会起作用,但它不能在代码中工作,当我从一个按钮插入segue时它可以工作但是进入一个单独的NSViewController,它不是NSWindowController的一部分.

我试图在这个问题上找到Apple的一些编程指南,但到目前为止还没有运气.

以下是我的故事板的概述:

故事板概述

这是我的NSWindowController子类,而func loginToMe2Team是来自NSToolBar的触发器,它的工作只是在打印语句出现在控制台上时找到.

import Cocoa

class me2teamWindowsController: NSWindowController {

@IBOutlet var mySignUp : NSToolbarItem!
@IBOutlet var myToolbar : NSToolbar!
let controller =  ViewController()

override func windowDidLoad() {
    super.windowDidLoad()
    print("window loaded")
}

override func windowWillLoad() {
    print("window will load")
}


@IBAction func logInToMe2Team(sender: AnyObject){

    controller.LogIn() //THIS IS THE FUNC I AM TESTING WITH

}

@IBAction func signUpToMe2Team(sender: AnyObject){

    controller.signUp()


}
Run Code Online (Sandbox Code Playgroud)

这是我的NSViewController子类与func LogIn.它的选择很好但是performSegueWithIdentifier却没有.我确实切断并超越了标识符,以确保它是一样的.

import Cocoa
import WebKit

class ViewController: NSViewController {

@IBOutlet weak var theWebPage: WebView!
@IBOutlet weak var progressIndicator: NSProgressIndicator!

override func viewDidLoad() {
    super.viewDidLoad()

    let urlString = "https://thewebpage.com.au"
    self.theWebPage.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: urlString)!))
}

override func viewDidAppear() {
}

func LogIn() {
    print("I logged in")
    self.performSegueWithIdentifier("goToTeamPage", sender: self)
    //THIS IS THE BIT THATS NOT WORKING
}

func signUp() {
    print("I have to sign up now")
}

override var representedObject: AnyObject? {
    didSet {
    }
}

func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!)
{
    self.progressIndicator.startAnimation(self)
}

func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!)
{
    self.progressIndicator.stopAnimation(self)
}

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Vác*_*vík 6

您需要使用自定义segue类(或者NSTabViewController如果它足以满足您的需求).将segue的类型设置为Custom,并指定您的类名:

在此输入图像描述

......并实施它.没有动画,很简单:

class ReplaceSegue: NSStoryboardSegue {
    override func perform() {
        if let src = self.sourceController as? NSViewController,
           let dest = self.destinationController as? NSViewController,
           let window = src.view.window {
            // this updates the content and adjusts window size
            window.contentViewController = dest
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我正在使用一张纸,想要转换到另一张不同尺寸的纸张,所以我需要做更多:

class ReplaceSheetSegue: NSStoryboardSegue {
    override func perform() {
        if let src = self.sourceController as? NSViewController,
           let dest = self.destinationController as? NSViewController,
           let window = src.view.window {
            // calculate new frame:
            var rect = window.frameRectForContentRect(dest.view.frame)
            rect.origin.x += (src.view.frame.width - dest.view.frame.width) / 2
            rect.origin.y += src.view.frame.height - dest.view.frame.height
            // don’t shrink visible content, prevent minsize from intervening:
            window.contentViewController = nil
            // animate resizing (TODO: crossover blending):
            window.setFrame(window.convertRectToScreen(rect), display: true, animate: true)
            // set new controller
            window.contentViewController = dest
        }
    }
}
Run Code Online (Sandbox Code Playgroud)