ios - 如何在没有 tableView 的情况下拉刷新?
问题描述
我有下一个控制器:
final class CategoryBreakdownViewController: UIViewController {
private let scrollView = UIScrollView(alwaysBounceVertical: true)
var refreshControl = UIRefreshControl()
我在哪里viewDidLoad
尝试实现 pull to refresh 没有tableView
:
private func setupRefreshControl() {
scrollView.alwaysBounceVertical = true
scrollView.bounces = true
refreshControl.addTarget(self, action: #selector(updateView), for: .valueChanged)
self.scrollView.addSubview(refreshControl)
}
@objc func updateView() {
SyncScheduler.syncImmediately(
success: {
self.refreshControl.endRefreshing()
},
failure: { [weak self] errorMessage in
self?.present(message: errorMessage, style: .error)
self?.refreshControl.endRefreshing()
}
)
}
但在我的情况下,这个解决方案不起作用,如何解决这个问题?
解决方案
您的方法似乎没有任何问题。
这是一个完整的示例——它添加了一个“全视图”滚动视图,带有一个 200 磅高的红色子视图(因此我们可以看到效果)。
向下拖动时,您应该会看到UIRefreshControl
“微调器”出现。向下拖动足够远,它会调用updateView()
函数。由于我们没有您的SyncScheduler
代码,因此我添加了 2 秒的异步延迟来模拟该过程:
final class CategoryBreakdownViewController: UIViewController {
private let scrollView = UIScrollView()
var refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.backgroundColor = .systemTeal
scrollView.translatesAutoresizingMaskIntoConstraints = false
let testView = UIView()
testView.backgroundColor = .red
testView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(testView)
view.addSubview(scrollView)
let contentGuide = scrollView.contentLayoutGuide
let frameGuide = scrollView.frameLayoutGuide
NSLayoutConstraint.activate([
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
testView.topAnchor.constraint(equalTo: contentGuide.topAnchor, constant: 20.0),
testView.leadingAnchor.constraint(equalTo: contentGuide.leadingAnchor, constant: 20.0),
testView.trailingAnchor.constraint(equalTo: contentGuide.trailingAnchor, constant: -20.0),
testView.bottomAnchor.constraint(equalTo: contentGuide.bottomAnchor, constant: -20.0),
testView.widthAnchor.constraint(equalTo: frameGuide.widthAnchor, constant: -40.0),
testView.heightAnchor.constraint(equalToConstant: 200.0),
])
setupRefreshControl()
}
private func setupRefreshControl() {
scrollView.alwaysBounceVertical = true
scrollView.bounces = true
refreshControl.addTarget(self, action: #selector(updateView), for: .valueChanged)
self.scrollView.addSubview(refreshControl)
}
@objc func updateView() {
// simulate a background process that takes 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: {
self.refreshControl.endRefreshing()
})
// SyncScheduler.syncImmediately(
// success: {
// self.refreshControl.endRefreshing()
// },
// failure: { [weak self] errorMessage in
// self?.present(message: errorMessage, style: .error)
// self?.refreshControl.endRefreshing()
// }
// )
}
}
推荐阅读
- google-cloud-platform - 如何使用云构建在谷歌云上使用云 sql 部署云运行?
- reactjs - 如何使用 React JS firestore 制作搜索框
- ios - 如何通过适用于我的 Java (android) 中的加密将其传递给 Swift 我尝试了几种方法,但我不能
- ios - 由于 SIGABRT 错误,Xamarin.Forms iOS 应用程序崩溃
- python - 创建一个标记任何条件实例通过的列
- sql - postgreSQL - 查找特定工具的下一课
- javascript - Thymeleaf - 复选框上的 POST/PATCH 方法
- docker - 错误:在 docker compose up - 找不到任何已安装的 .net core sdks
- c++ - 为什么指向类数组的全局指针与本地指针不同?
- javascript - JavaScript 铬自动化