如何在SwiftUI中将View()作为列表的一部分传递?

Lkabo

我定义了几个(最多)不同的SwiftUI视图:

ViewA(),ViewB(),ViewC().. ViewN()

每个视图都包含一个特定的信息,我想根据用户的选择来显示。

我创建了一个可哈希的,可标识的项目列表,我想将每个项目链接到一个特定的视图。但是我似乎无法克服这些错误。

这是我正在尝试做的一个具体示例:

//Country Definitions:

import Foundation
import Combine
import SwiftUI

let Countries = [
    CountryModel(countryID: "US", countryName: "United States", countryView: USAView() )
    CountryModel(countryID: "UK", countryName: "United Kingdom", countryView: UKView() )
]

struct CountryModel: Identifiable, Hashable {
    
    let id:UUID
    let countryID:String
    let countryName:String
    let countryView:View   //I have tried AnyView here, different issues, still no go...
    
    init(countryID:String, countryName:String, countryView:View) {
        self.id = UUID();
        self.countryID = countryID
        self.countryName = countryName
        self.countryView = countryView
    }
}

计划如何在理论上使用它在NavigationView / NavigationLink中,如下所示:


struct ContentView: View {
    
    var body: some View {
        
        NavigationView {
            
            ForEach(Countries) { thisCoutry in
                
                NavigationLink(destination: thisCoutry.countryView) { //Also tried forcing as! View, no good
                    MyItemCell(itemName: thisCoutry.countryName, itemDesc: thisCoutry.countryID)
                    
                }
            }
        }
    }
}

(MyItemCell只是一个用于格式化项目名称和ID的视图)。

到目前为止,尝试使用“视图”,我得到了以下错误:

协议“视图”只能用作一般约束,因为它具有“自身”或相关类型要求

还有一些关于不符合Equatable的问题。当我添加Equatable并使其具有返回true的存根时,没有帮助...

struct CountryModel: Hashable, Identifiable, Equatable {
    static func == (lhs: CountryModel, rhs: CountryModel) -> Bool {
        return true
    }

我还收到一条错误消息,声称它不符合Hashable,因此我尝试将其取出来,但还是没有成功。

任何想法表示赞赏。由于SwiftUI似乎在大约10点左右/之后变得时髦,因此尝试避免导航链接的列表过长,因此我必须开始分组,或者要更有创意...

struct ContentView: View {
    
    var body: some View {
        
        VStack{
            NavigationView {
                
                NavigationLink(destination: ViewA()) {
                    MyItemCell(itemName: "United States", itemDesc: "USA")
                    
                }
                
                NavigationLink(destination: ViewB()) {
                    MyItemCell(itemName: "United Kingdom", itemDesc: "UK")
                    
                }
            }
        }
    }
}
他的脾气

您可以使用AnyView类型擦除包装器(但它不仅应在模型中声明,还应在创建时显式使用-强制转换在这里不起作用,我认为这是错误的根源):

let Countries = [
    CountryModel(countryID: "US", countryName: "United States", 
       countryView: AnyView(USAView()) )    // << here !!
    CountryModel(countryID: "UK", countryName: "United Kingdom", 
       countryView: AnyView(UKView()) )
]

struct CountryModel: Identifiable, Hashable {
    
    let id:UUID
    let countryID:String
    let countryName:String
    let countryView:AnyView
    
    init(countryID:String, countryName:String, countryView:View) {
        self.id = UUID();
        self.countryID = countryID
        self.countryName = countryName
        self.countryView = countryView
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在PowerShell中将参数作为-file的一部分传递

如何在PHP中将“&”作为字符串的一部分传递?

如何在Jgit中将文件列表作为提交的一部分

如何在余烬应用程序中将api密钥作为url的一部分传递

如何在angularJs 1.5中将$ scope变量作为组件的templateUrl的一部分传递?

如何在Paw中将文件作为多部分请求的一部分上载?

如何在SwiftUI中将.fontWeight添加为ViewModifer的一部分

如何在scikit learning中将参数传递给仅管道对象的一部分?

如何在基于非模板的页面(src/pages 的一部分)中将变量传递给 GraphQL

如何在字典列表中找到字符串作为键值的一部分?

如何传递会话ID作为Soap请求的一部分?

C# 如何组合作为列表一部分的多个 JSON 数组?

如何计算在Python中作为列表一部分的集合的出现次数?

如何将列表的一部分传递给不同的变量?

如何在 Postman 中将文件作为请求参数的一部分发送

如何在python中将数组的一部分存储在不同的数组中

如何在iPhone开发中将度数符号添加为UILabel的一部分?

如何在iOS中将字符串的一部分加粗?

如何在Golang中将jsonb编码为http响应的一部分

如何在MarkLogic中将子元素包含为单词查询的一部分

如何在SQL中将NULL连接为字符串的一部分

如何在python中将api响应的一部分转换为完整的json

如何在python中将字符串用作变量的一部分

如何在 Python Pandas 中将列的一部分转换为日期?

如何在子查询中使用HAVING作为Select语句的一部分

作为Shell脚本的一部分,如何在后台运行隧道

如何在Flask中返回图像作为GET请求响应的一部分?

如何在 mysql 中执行 IF 语句作为 SELECT 语句的一部分

如何遍历嵌套列表的一部分?