替换Swift2 Storyboard MAC OSX下的NSViewController

时间:2015-10-27 01:35:00

标签: xcode macos swift storyboard osx-elcapitan

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

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

所以有两个问题 1.我希望能够在代码和第一个NSViewController中执行SegueWithIdentifier 2.通过替换同一NSWindowController中的第一个NSViewController来调出第二个NSViewController。

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

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

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

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

Storyboard overview

这是我的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()


}

这是我的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)
}

}

enter image description here

1 个答案:

答案 0 :(得分:6)

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

enter image description here

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

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

在我的情况下,我使用了一张纸,想要转换到另一张不同尺寸的纸张,所以我需要做更多的事情:

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