带有ViewModel的通用View SwiftUI

问题描述 投票:0回答:1

我正在寻找一种具有View和多态性的解决方案。我是一个带有特殊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
}

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

ios swift swiftui
1个回答
0
投票

这里是如何使用它的(由于缺少所有类型,我使用简单的存根复制了这些类型)。

经过测试并与Xcode 11.2 / iOS 13.2配合使用

[请注意,不允许在一个容器中放置不同的类型,因此,如果要执行此操作,则需要擦除类型,例如SwiftUI AnyViewView进行。

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()])
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.