在swiftui中使用多维字典进行导航
Navigation using multi dimensional dictionary in swiftui
我是 swift 的新手,在执行此操作时发现了一些问题:
假设我有一个 multiDim 字典 ["A": ["Sub1_A1", ["Sub1_A2": ["Sub2_A1", "Sub2_A2"]], "B": [ "Sub1_B1"]]。我希望通过使用这样的字典以及显示我在导航视图中选择的字典键的选项卡视图来构建导航列表。例如:
1.
2.
然后,一旦我选择了女装,我就会在这个导航页面:
3.
如果我选择裙子,我将被导航到此页面,将是最后一页,因为它是使用键 "Women"、"Skirt" 的多维字典的末尾,因此没有导航 [=62] =] 显示但只是 Text() 或 Button() 的列表。最后,如果我点击 "Mini Skirt",我将被定向到另一个视图,显示我选择的类别键序列的详细信息。
显示的标签名称将根据您选择的类别而定。如果您从 "Skirt" 向后导航到 "Women",选项卡名称 "Skirt" 将消失,仅显示 "Women" 和占位符标签名称 "Please Choose".
知道怎么做吗?
这是我的初步尝试:
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() 中有一个错误 "Unable to infer complex closure return type; add explicit type to disambiguate"。有什么想法可以在这里做什么吗?
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)
}
}
}
}
我是 swift 的新手,在执行此操作时发现了一些问题: 假设我有一个 multiDim 字典 ["A": ["Sub1_A1", ["Sub1_A2": ["Sub2_A1", "Sub2_A2"]], "B": [ "Sub1_B1"]]。我希望通过使用这样的字典以及显示我在导航视图中选择的字典键的选项卡视图来构建导航列表。例如:
1.
2. 然后,一旦我选择了女装,我就会在这个导航页面:
3. 如果我选择裙子,我将被导航到此页面,将是最后一页,因为它是使用键 "Women"、"Skirt" 的多维字典的末尾,因此没有导航 [=62] =] 显示但只是 Text() 或 Button() 的列表。最后,如果我点击 "Mini Skirt",我将被定向到另一个视图,显示我选择的类别键序列的详细信息。
显示的标签名称将根据您选择的类别而定。如果您从 "Skirt" 向后导航到 "Women",选项卡名称 "Skirt" 将消失,仅显示 "Women" 和占位符标签名称 "Please Choose".
知道怎么做吗?
这是我的初步尝试:
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() 中有一个错误 "Unable to infer complex closure return type; add explicit type to disambiguate"。有什么想法可以在这里做什么吗?
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)
}
}
}
}