带有 ViewModel 的通用视图 SwiftUI

2024-02-18

我正在寻找具有视图和多态性的解决方案。我有一个带有特殊 ViewModel 的协议 像那样:

protocol PQuestionView: View {
    associatedtype VM where VM : BaseQuestionViewModel
    var vm: Self.VM { get }
}

所以我可以在这样的结构中使用它:

struct test: PQuestionView {
    var vm:YesNoQuestionViewModel = YesNoQuestionViewModel(question: Question(), temporaryId: 3)
    var body: some View{
        VStack{
            Text("Yes")
        }
    }
}

我想要一个 PQuestionView 数组:

var questionViews: [PQuestionView]

但我有两个关联的类型,看来实现视图的方式不能作为多态性工作。所以我尝试了类似的事情:

struct StrongView<MyView: View,VM: BaseQuestionViewModel> : PQuestionView{
    var vm: VM
    var body: MyView
}

但它有一个强类型的结构,它不能解决我的通用性问题......这项工作是否存在一个好的解决方案?


以下是它的使用方式(由于缺少所有类型,我用简单的存根复制了那些类型)。

已测试并适用于 Xcode 11.2 / iOS 13.2

请注意,不允许在一个容器中放置不同的类型,因此如果您打算这样做,则需要类型擦除,例如 SwiftUIAnyView do for View.

protocol BaseQuestionViewModel {
}

struct YesNoQuestionViewModel: BaseQuestionViewModel {
}

protocol PQuestionView: View {
    associatedtype VM where VM : BaseQuestionViewModel
    var vm: Self.VM { get }
}

struct test: PQuestionView {
    var vm = YesNoQuestionViewModel()
    var body: some View{
        VStack{
            Text("Yes")
        }
    }
}

struct QuestionsHolder<T: PQuestionView>: View {
    var questionViews: [T]
    var body: some View {
        ForEach(0..<questionViews.count) { i in
            self.questionViews[i]
        }
    }
}

struct TestViewGenerics_Previews: PreviewProvider {
    static var previews: some View {
        List {
            QuestionsHolder(questionViews: [test(), test(), test()])
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 ViewModel 的通用视图 SwiftUI 的相关文章

随机推荐