【问题标题】:Accessing/Updating Nested Dictionary through Segues通过 Segues 访问/更新嵌套字典
【发布时间】:2016-11-19 05:06:59
【问题描述】:

我遇到了问题。我正在使用 swift 制作一个应用程序,您可以通过主视图控制器上的按钮选择一个大陆。这会将您带到第二个视图控制器,该大陆的国家及其人口显示在文本视图中。稍后,您使用文本字段从第三个视图控制器添加国家和人口,然后将此信息添加回预览文本视图。将此添加到其各自的大陆。

我在第一个视图控制器中有一个嵌套字典。当数据模型在第一个视图上时,如何从第三个视图添加信息并显示在第二个视图上?

这是我的数据模型:

var Dictionary : [String: [String: Int]] = [

"North America" : ["country1" : 0, "country2" : 0, "country3" : 0],
"Asia"          : ["country1" : 0, "country2" : 0, "country3" : 0],
"South America" : ["country1" : 0, "country2" : 0, "country3" : 0],
"Africa"        : ["country1" : 0, "country2" : 0, "country3" : 0],
"Europe"        : ["country1" : 0, "country2" : 0, "country3" : 0],
"Oceania"       : ["country1" : 0, "country2" : 0, "country3" : 0]

]

我是 swift 新手,这就是我完全困惑的原因。

【问题讨论】:

    标签: swift dictionary nested


    【解决方案1】:

    这个例子在 Swift 3 中

    据我了解,您需要在视图之间传递和改变数据集。

    我将为您提供一种在视图之间传递字典的简单方法,您将能够传递您的数据集并对其进行编辑,并且您对数据集的更改将在您的视图之间遍历。

    定义一个协议,告诉您的视图控制器它们必须有一个[String: [String: Int]] 变量类型的字典。

    protocol ViewPassesData : class {
        var dictionary : [String: [String: Int]] { get set }
    }
    

    让您处理数据的每个视图控制器都符合此协议。

    class FirstViewController : UIViewController, ViewPassesData { //...}
    
    class SecondViewController : UIViewController, ViewPassesData { //...}
    
    class ThirdViewController : UIViewController, ViewPassesData { //...}
    

    您需要将此添加到您的第一个视图控制器:

    var dictionary : [String: [String: Int]] = [
    
            "North America" : ["country1" : 0, "country2" : 0, "country3" : 0],
            "Asia"          : ["country1" : 0, "country2" : 0, "country3" : 0],
            "South America" : ["country1" : 0, "country2" : 0, "country3" : 0],
            "Africa"        : ["country1" : 0, "country2" : 0, "country3" : 0],
            "Europe"        : ["country1" : 0, "country2" : 0, "country3" : 0],
            "Oceania"       : ["country1" : 0, "country2" : 0, "country3" : 0]
    
        ]
    

    查看控制器 2 和 3

    var dictionary : [String: [String: Int]] = [:]
    

    现在您已经在视图控制器之间定义了一个通用接口,并且您已经告诉视图控制器它们必须遵守这种通用性,您可以简单地将这个为 segue 准备的函数粘贴到每个视图控制器中你的视图控制器。请注意,我们将视图控制器转换为我们的协议类型。由于我们的每个视图控制器都遵守我们的协议,因此演员表应该完美无缺,并且我们应该能够访问我们要转换的控制器中的字典。

    override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {      
        guard let vc = segue.destinationViewController as? ViewPassesData
           else { fatalError("wrong vc type") }
    
        vc.dictionary = self.dictionary
    }
    

    要测试我刚刚向您展示的内容,请在每个视图中的 viewDidLoad 中添加一条打印语句:

    override func viewDidLoad() {
        super.viewDidLoad()
        print("dictionary: \(dictionary)")
    }
    

    您会看到您的数据集正在视图之间传输。您将能够更新数据集并将其传递到下一个视图。

    【讨论】:

    • 非常感谢。这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2011-05-13
    相关资源
    最近更新 更多