包装 UITableView 时如何模仿 SwiftUI List 的无数据初始化程序

发布于 2025-01-11 12:58:46 字数 1877 浏览 1 评论 0原文

Apple 提供以下 SwiftUI List 初始值设定项:

List.init(selection: Binding?, content: () -> Content)

我想制作一个类似的组件,但自定义一些 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 {
      // ???
    }
  }
}

我在数据源委托方法中做什么?由于 ListUITableView 的包装器,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文