如何指定将保存 SwiftUI 自定义视图的数组的类型信息

Posted

技术标签:

【中文标题】如何指定将保存 SwiftUI 自定义视图的数组的类型信息【英文标题】:How to specify the type information of an array that would hold SwiftUI custom views 【发布时间】:2020-07-17 08:08:01 【问题描述】:

我正在学习 SwiftUI,我明白要使用 SwiftUI 框架创建视图元素,您的自定义类型必须符合“视图”协议。我有一个要求,我想声明一个数组,该数组将包含我将通过创建一个实现“视图”协议的结构来创建的自定义 SwiftUI 组件。现在我不确定要提到什么作为数组的类型,因为提供“视图”作为类型会给编译器错误,因为“Protocol 'View' 只能用作通用约束,因为它具有 Self 或相关的类型要求”。

struct ContentView: View 
    
    var tabs : [View]
    
    var body: some View 
        Text("Hello World")
    

【问题讨论】:

这不是 SwiftUI 的方向...尝试使用模型(或视图模型)对象数组代替,并根据它们在正文中创建相应的视图。 看看苹果的教程:developer.apple.com/tutorials/swiftui 你为什么要在另一个视图上存储一组视图?你想达到什么目的? 【参考方案1】:

这里演示了根据某些模型枚举生成不同视图的可能方法。使用 Xcode 11.4 / ios 13.4 测试

enum CustomTabDescriptior: Int 
    case one = 1
    case two = 2
    case three = 3

    var label: String 
        "\(self.rawValue).square"
    

    // can be used also a function with arguments to be passed inside
    // created corresponding views
    var view: some View 
        Group 
            if self == .one 
                Text("One")    // << any custom view here or below
            
            if self == .two 
                Image(systemName: "2.square")
            
            if self == .three 
                Button("Three") 
                    print(">> activated !!")
                
            
        
    


struct DemoDynamicTabView: View 
    let tabs: [CustomTabDescriptior] = [.one, .two, .three]
    var body: some View 
        TabView 
            ForEach(tabs, id: \.self)  tab in
                tab.view
                    .tabItem 
                        Image(systemName: tab.label)
                    
            
        
    

【讨论】:

非常感谢您的回答。我正在尝试构建一个自定义 TabView,我可以在其中传递一些参数并动态构建选项卡栏。我用我使用 UITabBarController 构建类似东西的经验来解决这个问题。这就是使用数组保存视图组件的原因。您的代码在 SwiftUI 中为我提供了正确的方法。谢谢你!!。并且编译器错误与使用“具有关联类型的协议”作为变量的类型有关,这不是 SwiftUI 特有的。

以上是关于如何指定将保存 SwiftUI 自定义视图的数组的类型信息的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义数组保存/重新加载到 plist

SwiftUI 如何获取自定义幻灯片转换的视图大小?

如何在 SwiftUI 中添加自定义容器视图

SwiftUI - 如何在文本视图中更改自定义 SF 符号的颜色?

如何在 SwiftUI 视图中使用自定义 UI 控件,例如 Button?

导航时如何在 SwiftUI 中使用自定义视图转换?