Проблема:
У меня есть конкретный UITableView
в моем проекте, и я копирую и вставляю код из этого UITableView
и использую код для похожих экранов; этот подход к вещам действительно беспокоит меня.
Что я пробовал:
Я пытался найти способ обойти это. Например, я попытался использовать делегат и шаблон c, но продолжал получать ошибки.
Я попытался добавить объявление шаблона c в мой класс-координатор класса (см. CustomTableView ниже), однако я только что получили ошибки вроде: Protocol can only be used as a generic constraint because it has Self or associated type requirements
, поэтому я просто переместил его обратно в структуру.
Я думал о том, чтобы просто объявить список моих моделей представлений в моей структуре UITableView
как @ObservedObject
и продолжаю с моим проектом. Тем не менее, это кажется легким путем, который заставляет меня думать, что это будет неправильный способ решить эту проблему.
Что мне не хватает?
Там Должен быть способ, которым я могу повторно использовать тот же самый tableView, просто передав ему связанный viewModel и никогда не требуя объявления ObservedObjects в структуре tableView.
У меня есть протокол, который выглядит следующим образом:
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)
}
}
}
Я перепробовал все и, похоже, продолжаю ходить кругами , Я думал о том, чтобы иметь одну модель представления, которая ссылается на все мои другие модели представления, а затем передать ее в свой пользовательский вид таблицы, но я не осознаю, что, возможно, я что-то упустил, возможно, мои попытки решить все это были неудачными. aws.
Итак, как мне просто настроить мой CustomTableView, чтобы он мог работать с любым ViewModel, имеющим тип ObservableObject?
Заранее спасибо.