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

2.,一旦我选择了女装,我就会出现在这个导航页面上:

3. --如果我选择了裙子,我将被导航到这个页面,因为它是使用键"Women“、”“的多点字典的末尾,因此没有显示导航链接,只显示了文本()或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()中有一个错误“无法推断复杂的闭包返回类型;添加显式类型来消除歧义”。有什么好办法吗?
发布于 2020-06-09 10:08:05
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)
}
}
}
}https://stackoverflow.com/questions/62274449
复制相似问题