首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构建协议驱动的SwiftUI视图结构?

如何构建协议驱动的SwiftUI视图结构?
EN

Stack Overflow用户
提问于 2020-08-09 12:35:11
回答 1查看 53关注 0票数 1

我定义了两个协议

代码语言:javascript
复制
protocol AxisInstanceProtocol {
    var name:String {get set}
}

protocol StyledAxisProtocol {
    associatedtype  AxisInstance: AxisInstanceProtocol
    var axisInstances: [AxisInstance] {get set}
}

我尝试构建SwiftUI视图结构。

代码语言:javascript
复制
struct StyledAxesView<StyledAxis: StyledAxisProtocol>: View {
    
    @EnvironmentObject var environment: ContentManger
    
    var body: some View {
        VStack {
            ForEach ((0..<environment.axes.count), id: \.self) { axisIndex in
                StyledAxisView(styledAxis: self.$environment.axes[axisIndex])
            }
        }
    }
}

我将ContentManagerClass放在StyledViewAxis中,以筛选<StyledAxis:StyledAxisProtocol>。我觉得没问题。在以后的所有子视图中,将其定义为StyleAxesView<MyStyledAxis>.ContentManger比comapare类型容易得多。

代码语言:javascript
复制
extension StyledAxesView {
    class ContentManger: ObservableObject {
        @Published var axes: [StyledAxis] = []
    }
}

在底部,我有AxisInstance视图

代码语言:javascript
复制
struct InstanceView<AxisInstance: AxisInstanceProtocol>: View {
    
    @Binding var instance: AxisInstance
    
    var body: some View {
        Text("\(instance.name)")
        // Will be much more complicated, editing many parameters of the `instance`
    }
}

但我不知道如何使ForEach循环将instances传递到分隔视图中,并使它们成为@Binded (?)要更新整个[StyledAxis]数组,请执行以下操作。

代码语言:javascript
复制
struct StyledAxisView<StyledAxis: StyledAxisProtocol> : View {
    @Binding var styledAxis: StyledAxis
    
    var body : some View {
        
        VStack {
            ForEach ($styledAxis.axisInstances, id: \.self) { instance in
                 InstanceView(instance: instance)
            }
        }
    }
}

在这个版本中,我有一个错误Cannot convert value of type 'InstanceView<AxisInstance>' to closure result type '_'。我尝试了许多不同的方法,没有一个人编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-09 12:49:29

以下是可能的方法(仅修改部分,用Xcode 12测试)

代码语言:javascript
复制
struct StyledAxisView<StyledAxis: StyledAxisProtocol> : View {
    @Binding var styledAxis: StyledAxis

    var body : some View {

        VStack {
            ForEach (styledAxis.axisInstances.indices, id: \.self) { index in
                 InstanceView(instance: self.$styledAxis.axisInstances[index])
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63326404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档