使用 SwiftUI 的自省库 UIRefreshControl 不起作用

问题描述

我正在尝试使用 Introspect 库在出现下拉菜单时刷新 SwiftUI 中的列表控件。

我的列表修饰符如下:

.introspectTableView (tableView in {    
    tableView.refreshControl = UIRefreshControl()
    // code here to get new data
    tableView.refreshControl?.endRefreshing()
}

获取新数据的代码不断执行。

任何帮助将不胜感激。

解决方法

每次刷新视图时都会调用 introspectTableView 闭包,这就是获取新数据的代码不断执行的原因。

要解决这个问题,你需要做的是只有在用户被拉取时才调用你的刷新代码。我能做到这一点的唯一方法是创建一个 RefreshHelper 类,因为 UIRefreshControl 仍然依赖于 @objc 函数和选择器。

这是一个大致实现您想要的示例:

struct ContentView: View {
    @State var data: [String] = (0...5).map { "Item \($0)" }
    let refreshHelper = RefreshHelper()

    class RefreshHelper {
        var parent: ContentView?
        var refreshControl: UIRefreshControl?

        @objc func didRefresh() {
            guard let parent = parent,let refreshControl = refreshControl else { return }
            parent.data.append("Item \(parent.data.count)") // load data here
            refreshControl.endRefreshing()
        }
    }

    var body: some View {
        List(data,id: \.self) { i in
            Text("Item \(i)")
        }
        .introspectTableView { tableView in
            let control = UIRefreshControl()

            refreshHelper.parent = self
            refreshHelper.refreshControl = control

            control.addTarget(refreshHelper,action: #selector(RefreshHelper.didRefresh),for: .valueChanged)
            tableView.refreshControl = control
        }
    }
}