【发布时间】:2021-04-29 09:11:17
【问题描述】:
我正在将 Pull To Refresh 添加到基于 SwiftUI 的应用程序中。为此,我不得不退回到 UIKit。由于我想跨多个表和数据模型(使用共享协议)使用 Pull To Refresh,因此我想使用泛型。
我传入了我的dataModel的类型,我还想传入我想在scrollView中实例化的SwiftUI View的类型。
但是,当我添加我声明支持协议“视图”的通用类型 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()
}
}
}
【问题讨论】: