程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了通过 Swift 泛型初始化 SwiftUI 视图大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决通过 Swift 泛型初始化 SwiftUI 视图?

开发过程中遇到通过 Swift 泛型初始化 SwiftUI 视图的问题如何解决?下面主要结合日常开发的经验,给出你关于通过 Swift 泛型初始化 SwiftUI 视图的解决方法建议,希望对你解决通过 Swift 泛型初始化 SwiftUI 视图有所启发或帮助;

我正在向基于 SwiftUI 的应用程序添加下拉刷新。为了原生地做到这一点,我不得不退回到 UIKit。由于我想跨多个表和数据模型(使用共享协议)使用 Pull To refresh,因此我想使用泛型。

我传入了我的 dataModel 的类型,我还想传入我想在 scrollVIEw 中实例化的 SwiftUI 视图的类型。

但是,当我添加泛型类型 V(我声明它支持协议“视图”)时,在代码尝试实例化视图时出现编译错误。

类型 'V' 没有成员 'init'

如果我删除泛型类型“V”,并硬编码一个特定的 SwiftUI 视图类型来实例化,例如 DataVIEw,这一切都很好 - 但这并没有给我我需要的视图类型的灵活性。>

我该如何修复这个编译错误?

import SwiftUI

struct GenericrefreshVIEw<T,V>: UIVIEwRepresentable where T:ObservabLeobject,T:dataModel,V: VIEw {

    @EnvironmentObject var dataModel: T

    func makeCoordinator() -> Coordinator {
        Coordinator(self,regs: dataModel)
    }

    let size: CGSize

    func makeUIVIEw(context: Context) -> UIScrollVIEw {
        let scrollVIEw = UIScrollVIEw()
        scrollVIEw.refreshControl = UIrefreshControl()
        scrollVIEw.refreshControl?.addTarget(context.coordinator,action: #SELEctor(Coordinator.handlerefreshControl(sender:)),for: .valueChanged)

        // *******************************************************************************
        let refreshVC = UIHosTingController(rootVIEw: V()) // Type 'V' has no member 'init'
        // *******************************************************************************

        refreshVC.vIEw.frame = CGRect(x: 0,y: 0,wIDth: size.wIDth,height: size.height)

        scrollVIEw.addSubvIEw(refreshVC.vIEw)

        return scrollVIEw
    }

    func updateUIVIEw(_ uiVIEw: UIScrollVIEw,context: Context) {}

    class Coordinator: NSObject {
        var refreshScrollVIEw: GenericrefreshVIEw
        var dataModel: T

        init(_ refreshScrollVIEw: GenericrefreshVIEw,dataM: T) {
            self.refreshScrollVIEw = refreshScrollVIEw
            self.dataModel = dataM
        }

        @objc func handlerefreshControl (sender: UIrefreshControl) {
            self.dataModel.refresh()
            sender.endrefreshing()
        }
    }
}

解决方法

你可以要求它从外部注入,比如

struct GenericrefreshView<T,V>: UIViewRepresentable where T:ObservabLeobject,T:dataModel,V: View {

    @EnvironmentObject var dataModel: T
    let contentView: V                      // here !!
    // let builder: () -> V                 // alternate,as view builder

    func makeCoordinator() -> Coordinator {
        Coordinator(self,regs: dataModel)
    }

    let size: CGSize

    func makeUIView(context: Context) -> UIScrollView {
        let scrollView = UIScrollView()
        scrollView.refreshControl = UIrefreshControl()
        scrollView.refreshControl?.addTarget(context.coordinator,action: #SELEctor(Coordinator.handlerefreshControl(sender:)),for: .valueChanged)

        let refreshVC = UIHosTingController(rootView: self.contentView)    // here !!

   ...

更新:简化以避免遗漏部分,这里是使用演示

struct DemoView: View {
    var body: some View {
        GenericrefreshView(dataModel: TestViewModel(),contentView: Text("Demo"),size: CGSize(width: 100,height: 100))
    }
}

struct GenericrefreshView<T,V: View {

    @ObservedObject var dataModel: T     // << EnvironmentObject is internal,so cAnnot be inferred from input arguments,so not usable here
    let contentView: V
    let size: CGSize

大佬总结

以上是大佬教程为你收集整理的通过 Swift 泛型初始化 SwiftUI 视图全部内容,希望文章能够帮你解决通过 Swift 泛型初始化 SwiftUI 视图所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:视图通过