使用数据在 2 个不同的 NSViewController 之间切换

Posted

技术标签:

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

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

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

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

谢谢!

【问题讨论】:

相关(是关于 ios,但很多东西也适用于 macOS):***.com/q/5210535/3151675 【参考方案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 传递数据。 我不明白该怎么做。我可以问你一个代码示例吗?再次感谢您! 我已经编辑了答案以包含示例。看看吧。 明天早上会检查,现在我不在电脑旁。不过还是谢谢!

以上是关于使用数据在 2 个不同的 NSViewController 之间切换的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php pdo 中使用 1 个表单将数据插入到 2 个不同的表中?

配置 Springboot 以使用 2 个不同的数据库

React Hook 在单击 2 个不同的按钮时从 APi 获取数据

在报告中创建新视图;使用不同的数据。为了在 Excel 中将 2 个报告导出到同一页面

使用具有 2 个不同原型单元格的数据加载表格视图

在R中使用来自2个不同数据框架的列变量进行T检验。