【问题标题】:Swiching between 2 diferent NSViewControllers with data使用数据在 2 个不同的 NSViewController 之间切换
【发布时间】:2018-07-18 00:25:39
【问题描述】:

我是 Swift 和 OSX 开发的绝对新手,如果我的问题太菜鸟,我很抱歉。我想了解 NSViewControllers 之间的导航原理。

我有我的默认ViewController,其中是登录名和密码字段以及登录按钮。单击按钮后,返回令牌。现在我试图将“视图”更改为SecondViewController 并保存某处令牌,我将来会需要它。我该怎么做?并且可以在函数中做到这一点吗?:

@IBAction func loginButton(_ sender: Any) {
   .... 
}

谢谢!

【问题讨论】:

标签: swift macos navigation


【解决方案1】:

您需要使用segues 来执行此操作。

首先使用故事板编辑器在ViewControllers 之间建立segues 连接。之后,您需要在情节提要的属性检查器上为 segues 提供一个标识符。然后在您的代码中,您可以通过segue 调用新的ViewController,如下面的代码所示。

通过此代码,您可以使用按钮传递数据:

class ViewController: NSViewController {

    var dataToPass: String = "DataToPass"

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func loginButton(_ sender: Any) {

        performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueIdentifier"), sender: self)
    }

    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {

        if segue.identifier!.rawValue == "segueIdentifier" {
            let destinationViewController = segue.destinationController as! ViewController2

            destinationViewController.dataToReceive = dataToPass
        }
    }
}


class ViewController2: NSViewController {

    var dataToReceive: String

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

使用此代码,您将使用override viewWillAppear

class ViewController: NSViewController {

    var dataToPass: String = "DataToPass"

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func viewWillAppear() {

        performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueIdentifier"), sender: self)
    }

    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {

        if segue.identifier!.rawValue == "segueIdentifier" {
            let destinationViewController = segue.destinationController as! ViewController2

            destinationViewController.dataToReceive = dataToPass
        }
    }
}


class ViewController2: NSViewController {

    var dataToReceive: String

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

在这两种情况下,您都需要确保要传递给其他视图控制器的数据不为空。

【讨论】:

  • 感谢您的帮助。现在我可以在单击按钮时传输数据。但是当我尝试在两个ViewControllers 之间进行排序时,我只有 (show/modal/sheet/popover/custom) 选项。是否有可能在初始窗口中显示 ViewController2?将 ViewController 替换为 ViewController2。
  • 您可以更改故事板上的初始视图控制器,但这样您将无法将数据传递给它,因为它将是第一个视图控制器。您可以做的另一种方法是在viewDidLoadviewWillAppear 上执行segue,保持override prepare 传递数据。
  • 我不明白该怎么做。我可以问你一个代码示例吗?再次感谢您!
  • 我已经编辑了答案以包含示例。看看吧。
  • 明天早上会检查,现在我不在电脑旁。不过还是谢谢!
猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多