首页 > 解决方案 > 在 swiftui 中使用多维字典进行导航

问题描述

我是 swift 新手,发现这样做有一些问题:假设我有一个 multiDim dict ["A": ["Sub1_A1", ["Sub1_A2": ["Sub2_A1", "Sub2_A2"]], "B": [“Sub1_B1”]]。我希望通过使用这样的字典来构建一个导航列表,同时还有一个 tabview 显示我在导航视图中选择了哪个字典键。例如:

1.

2. 然后,一旦我选择了女装,我就会在这个导航页面中:

3. 如果我选择了裙子,我将被导航到这一页,将是最后一页,因为它是使用“女性”、“裙子”键的多维度字典的结尾,因此没有显示导航链接而只是Text() 或 Button() 的列表。最后,如果我点击“迷你裙”,我将被引导到另一个视图,显示我选择的类别键序列的详细信息。

出现的选项卡名称将根据您选择的类别而定。如果您从“裙子”向后导航到“女性”,选项卡名称“裙子”将消失,只显示“女性”和占位符标签名称“请选择”。

知道怎么做吗?

这是我的初步尝试:

struct PlayingWithMultiDimNavLink: View {

//    let multiDimDict:[String:Any] = ["A": ["Sub1_A1", "Sub1_A1"], "B": ["Sub1_B1", "Sub1_B1"]]

    let multiDimDict = ["A": "1", "B": "2"]


    var body: some View {

        NavigationView{
            List {
                ForEach(multiDimDict.keys.sorted(), id: \.self) { key in

                    NavigationLink(destination: GenerateChildView(key: key, dict: self.multiDimDict)){

                        Text(key)
                    }

                }
            }
        }

    }
}





struct GenerateChildView: View {

var key: String
var dict: [String: Any]

init(key: String, dict: [String: Any] ){
    self.key = key
    self.dict = dict
}


var body: some View {
    VStack{// Unable to infer complex closure return type; add explicit type to disambiguate
        if isString(key:key, dict: dict){
            List{
                HStack{
                    Text(String(describing: dict[key]))
                }

            }
        }

        if isStringList(key:key, dict: dict){

            List{
                ForEach(dict[key], id: \.self){ content in
                    HStack{
                        Text(content)
                    }

                }

            }

        }



        else{

            Text("Bla Bla Bla")
        }

    }
}




func isStringList(key: String, dict: [String: Any])->Bool{
    if let stringList = dict[key] as? [String]{
        print(stringList)
        return true
    }
    else{
        return false
    }

}



func isString(key: String, dict: [String: Any])-> Bool{
    if let string = dict[key] as? String{
        print(string)
        return true
    }
    else{
        return false
    }
}

}

我将 multiDimDict:[String:Any] 声明为 multiDimDict 因为字典可以是任何深度级别的嵌套字典。

但是这不会编译,在 generateChildView() 中有一个错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。任何想法在这里做什么?

标签: iosswiftuiswiftui-navigationlink

解决方案


SwiftUI 不适用于Any类型,所以一旦你检测到你的数据类型,你必须强制转换它以让 SwiftUI 知道如何继续。

这是原始代码的固定部分。使用 Xcode 11.4 / iOS 13.4 测试

if isStringList(key:key, dict: dict) {
    List{
        // verified detected [String], so cast it explicitly to 
        // give chance to check types here
        ForEach(dict[key] as! [String], id: \.self) { content in
            HStack{
                Text(content)
            }
        }
    }
}

推荐阅读