【发布时间】:2020-08-07 12:54:17
【问题描述】:
问题:
我的项目中有一个特定的UITableView,我发现自己从这个UITableView 复制和粘贴代码并将代码用于类似的屏幕;这种处理事情的方法真的让我很烦。
我的尝试:
我试图找到解决这个问题的方法。例如,我尝试使用委托和泛型,但一直出错。
我尝试将泛型声明添加到我的 Coordinator 类(参见下面的 CustomTableView)的 init 函数中,但是,我得到了如下错误:Protocol can only be used as a generic constraint because it has Self or associated type requirements,所以我只是将它移回了结构。
我考虑过将我的UITableView 结构中的视图模型列表声明为@ObservedObject,然后继续我的项目。然而,这似乎是一种简单的解决方法,这让我认为这是解决这个问题的错误方法。
我错过了什么?
必须有一种方法可以重用同一个 tableView,只需传入其关联的 viewModel,而无需在 tableView 结构中声明 ObservedObjects。
我的协议如下所示:
protocol CustomTableViewDelegate: ObservableObject {
// ...
}
该协议中的所有闭包基本上都是UITableViewDelegates 方法的克隆。我为什么要这样做?我这样做是为了让任何时候我的任何视图模型都需要使用我的自定义UITableView,我可以简单地遵循这个委托。
就像我在视图模型中所做的那样:
class CustomViewModel: ObservableObject, CustomTableViewDelegate {
// ...
}
这是我自定义的UITableView(我已经删除了一些函数来减少代码):
struct CustomTableView<T: CustomTableViewDelegate>: UIViewRepresentable {
var viewModel: T
class Coordinator: NSObject, UITableViewDelegate, UITableViewDataSource {
var customTableView: CustomTableView
init(_ customTableView: CustomTableView) {
self.customTableView = customTableView
}
func numberOfSections(in tableView: UITableView) -> Int {
self.customTableView.viewModel.numberOfSections(in: tableView)
}
func makeCoordinator() -> CustomTableView.Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> UITableView {
let coordinator = context.coordinator
return context.coordinator.customTableView.viewModel.makeUIView(coordinator: coordinator)
}
func updateUIView(_ uiView: UITableView, context: Context) {
context.coordinator.customTableView.viewModel.updateUIView(uiView, coordinator: context.coordinator)
}
}
}
在我看来:
struct MyMainView: View {
@EnvironmentObject var customViewModel: CustomViewModel
var body: some View {
return
VStack {
CustomTableView<CustomViewModel>(viewModel: customViewModel)
}
}
}
我已经尝试了所有方法,但似乎一直在绕圈子。我曾想过拥有一个引用我所有其他视图模型的视图模型,然后将其传递到我的自定义表格视图中,但我没有意识到也许我遗漏了一些东西,也许我解决这一切的尝试都有缺陷.
那么,我怎样才能简单地设置我的 CustomTableView 以便它可以与任何具有 ObservableObject 类型的 ViewModel 一起使用?
提前致谢。
【问题讨论】:
标签: ios swift uitableview cocoa-touch swiftui