首页 > 解决方案 > 如何在没有 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()
            }
        )
    }

但在我的情况下,这个解决方案不起作用,如何解决这个问题?

标签: iosswiftpull-to-refresh

解决方案


您的方法似乎没有任何问题。

这是一个完整的示例——它添加了一个“全视图”滚动视图,带有一个 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()
//          }
//      )
        
    }
}

推荐阅读