xcode - 替换 Swift2 Storyboard MAC OSX 下的 NSViewController

标签 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 添加一个按钮并向 secondViewController 添加一个 segue 然后当我选择该按钮时 secondViewController 出现就好了但是在一个单独的窗口中不是我想要的 NSWindowController 并且 firstViewController 没有得到已替换但保留在 NSWindowController 中。

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

我正试图从 Apple 那里找到一些关于这个问题的编程指南,但到目前为止还没有成功。

这是我的 Storyboard 的概述:

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

最佳答案

您需要使用自定义的 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
        }
    }
}

关于xcode - 替换 Swift2 Storyboard MAC OSX 下的 NSViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33358549/

相关文章:

c++ - xcode:体系结构 x86_64 的 undefined symbol [cout <<]

ios - 具有相同选项卡 Controller 的多个 View Controller

c++ - 使用 Cmake,如何防止库源包含在我的 IDE 中?

适用于 Mac 的 Java 应用程序

ios - 从 swift 向 NSMutableArray 添加字典

ios - 如何解析 IOS 中的小块 JSON 数据?

swift - UIView 子类 (Swift4) - 自定义方法 (setNumber) 未按预期工作

swift - 这是 Xcode 中的错误还是程序员应该避免的做法?

macos - 如何用其他更改覆盖 WindowDidLoad

macos - 如何中止 NSStepper 自动重复?