【问题标题】:Replace NSViewController under Swift2 Storyboard MAC OSX在 Swift2 Storyboard MAC OSX 下替换 NSViewController
【发布时间】:2016-01-26 07:23:28
【问题描述】:

我是 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 那里找到一些关于这个问题的编程指南,但到目前为止还没有运气。

这是我的故事板中的概述:

这是我的 NSWindowController 的子类,函数 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)
}

}

【问题讨论】:

  • 如果有人有解决方案,仍然真的需要这个问题的答案。

标签: xcode macos swift storyboard osx-elcapitan


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我会试一试,然后回复你。感谢您的回复。
  • 感谢 Vaclav,修复了它。
  • 嗨瓦茨拉夫。您能否帮助解决我无法从 func LogIn() 执行 segue 的另一个问题。它现在可以在 ViewController 上的 IBAction 按钮中正常工作,但不能来自 func LogIn()。有没有一种方法可以调用 func LogIn() 并执行自定义 Segue,因为我知道正在调用 func 但它不会触发 performSegue。
  • 我的赌注是标识符输入错误,或者 XIB 文件中没有提供标识符。
  • 感谢 Vaclav,我认为这与发送方方面有关,因为 func 和 IBAction 都指向第三个 func,但仍然只有 IBAction 起作用。我有另一个解决方案,我会尝试,并在我破解后更新问题。再次感谢。
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多