包装 UITableView 时如何模仿 SwiftUI List 的无数据初始化程序
Apple 提供以下 SwiftUI List
初始值设定项:
List
我想制作一个类似的组件,但自定义一些 List
中未公开的 UITableView
行为。另外,我想镜像这个单选、无数据初始化程序,因为我没有太多任意数据,并且想在 ViewBuilder 闭包中内联定义我的行。那么,包装 UITableView
:
struct CustomizedList<SelectionValue: Hashable, Content: View>: UIViewRepresentable {
@Binding var selection: SelectionValue
@ViewBuilder var content: () -> Content
func makeUIView(context: Context) -> UITableView {
let tableView = UITableView()
tableView.delegate = context.coordinator
tableView.dataSource = content.coordinator
return tableView
}
func updateUIView(_ tableView: UITableView, context: Context) {
// todo
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, UITableViewDelegate, UITableViewDataSource {
private var parent: CustomizedList
init(_ parent: CustomizedList) {
self.parent = parent
}
// delegate methods to customize behavior
// ...
// data source methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// ???
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// ???
}
}
}
我在数据源委托方法中做什么?由于 List
是 UITableView
的包装器,Apple 如何为 List
的无数据初始化器实现数据源委托方法? (另请注意,对于 List
的数据初始值设定项,Data
只是初始值设定项的泛型,而不是 List
本身。)
是否可以在没有数据源的情况下使用 UITableView
,只需传递 Content
(使用一些 View
-to-UIView
包装)?
Apple offers the following SwiftUI List
initializer:
List<SelectionValue: Hashable, Content: View>.init(selection: Binding<SelectionValue?>?, content: () -> Content)
I would like to make a similar component, but customizing some of the UITableView
behaviors not exposed in List
. Also, I would like to mirror this single-selection, data-less initializer, because I don't have much arbitrary data, and would like to define my rows in-line in a ViewBuilder closure. So, wrapping UITableView
:
struct CustomizedList<SelectionValue: Hashable, Content: View>: UIViewRepresentable {
@Binding var selection: SelectionValue
@ViewBuilder var content: () -> Content
func makeUIView(context: Context) -> UITableView {
let tableView = UITableView()
tableView.delegate = context.coordinator
tableView.dataSource = content.coordinator
return tableView
}
func updateUIView(_ tableView: UITableView, context: Context) {
// todo
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, UITableViewDelegate, UITableViewDataSource {
private var parent: CustomizedList
init(_ parent: CustomizedList) {
self.parent = parent
}
// delegate methods to customize behavior
// ...
// data source methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// ???
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// ???
}
}
}
What do I do in the data source delegate methods? Since List
is a wrapper around UITableView
, how is Apple implementing the data source delegate methods for the data-less initializers of List
? (Also notice that for List
's data initializers, Data
is only a generic of the initializer, not List
itself.)
Is it possible to use UITableView
without a data source, and just pass on the Content
(with some View
-to-UIView
wrapping)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论