大佬教程收集整理的这篇文章主要介绍了通过 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,请注明来意。