问题描述
我正在尝试使用 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
}
}
}