ios - 在 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() 中有一个错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。任何想法在这里做什么?
解决方案
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)
}
}
}
}
推荐阅读
- javascript - JavaScript:TypeError:发布到不和谐时将循环结构转换为 JSON
- setuptools - python tox - 在去测试点的路上丢东西
- html - “如何使用 'li 内跨度中的图像进入标签',然后修复高度和跨度宽度类”
- flutter - 如何匹配在其他小部件中最高的行小部件的高度
- inheritance - Flutter 简单继承概念
- c# - LINQ - 如何在哪里忽略空列表
- r - 如何查找坐标是否在多边形的边界内
- c# - 如何通过 HttpContext 访问 action 参数?
- netlogo - 海龟在越线时孵化
- azure - “属性值无效”是什么意思?