Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIScrollView中的UIRefreshControl不';Don’我不会消失的_Ios_Swift_Cocoa Touch_Uiscrollview_Uirefreshcontrol - Fatal编程技术网

Ios UIScrollView中的UIRefreshControl不';Don’我不会消失的

Ios UIScrollView中的UIRefreshControl不';Don’我不会消失的,ios,swift,cocoa-touch,uiscrollview,uirefreshcontrol,Ios,Swift,Cocoa Touch,Uiscrollview,Uirefreshcontrol,我试图在UIScrollView中使用UIRefreshControll,但我遇到了一个问题,需要多次滚动才能刷新它。我需要用双手来让它工作,所以我决定写一些滚动逻辑来开始刷新 现在的问题是,有时EndRefresh函数不会使UIRefreshControll视图消失,而我最终会永远将其保留在那里 我尝试在主队列中延迟调用endRefreshing,但它不起作用。我还尝试将isHidden设置为true,并将其从SuperView中移除。我没能成功 import UIKit class Ref

我试图在UIScrollView中使用UIRefreshControll,但我遇到了一个问题,需要多次滚动才能刷新它。我需要用双手来让它工作,所以我决定写一些滚动逻辑来开始刷新

现在的问题是,有时EndRefresh函数不会使UIRefreshControll视图消失,而我最终会永远将其保留在那里

我尝试在主队列中延迟调用endRefreshing,但它不起作用。我还尝试将isHidden设置为true,并将其从SuperView中移除。我没能成功

import UIKit

class RefreshableView : UIView {

    @IBOutlet weak var scrollView: UIScrollView!

    private let refreshControl = UIRefreshControl()
    private var canRefresh = true
    var refreshFunction: (() -> ())?

    func setupUI() {
        backgroundColor = ColorName.grayColor.color
        scrollView.refreshControl = refreshControl
    }

    func endRefreshing() {
        self.refreshControl.endRefreshing()
    }
}

extension RefreshableView: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if scrollView.contentOffset.y < -100 {
            if canRefresh && !self.refreshControl.isRefreshing {

                self.canRefresh = false
                self.refreshControl.beginRefreshing()

                self.refreshFunction?()
            }
        } else if scrollView.contentOffset.y >= 0 {
            self.canRefresh = true
        }
    }
}
导入UIKit
类RefreshTableView:UIView{
@iBCROLLVIEW:UIScrollView!
私有let refreshControl=UIRefreshControl()
私有变量canRefresh=true
变量刷新函数:(()->())?
func setupUI(){
backgroundColor=ColorName.grayColor.color
scrollView.refreshControl=refreshControl
}
func endreshing(){
self.refreshControl.endRefreshing()
}
}
扩展刷新视图:UIScrollViewDelegate{
func scrollViewDidScroll(scrollView:UIScrollView){
如果scrollView.contentOffset.y<-100{
如果可以刷新&!self.refreshControl.isRefreshing{
self.canRefresh=false
self.refreshControl.beginRefreshing()
自我刷新功能()
}
}否则,如果scrollView.contentOffset.y>=0{
self.canRefresh=true
}
}
}

滚动视图的
refreshControl
自动处理拉入刷新功能,因此您不需要任何
scrollViewDidScroll()
代码

假设您的故事板看起来像这样,其中:

  • 红色背景的视图是
    RefreshableView
    类的一个实例
  • 它包含一个滚动视图(通过
    @IBOutlet
    连接)
  • 滚动视图中的一些内容(这里我只有一个标签)

您的代码可以如下所示:

class RefreshableView : UIView {

    @IBOutlet var scrollView: UIScrollView!

    private let refreshControl = UIRefreshControl()

    var refreshFunction: (() -> ())?

    func setupUI() {
        backgroundColor = .gray

        refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)

        scrollView.refreshControl = refreshControl
    }

    @objc func didPullToRefresh() {
        print("calling refreshFunction in controller")
        self.refreshFunction?()
    }

    func endRefreshing() {
        print("end refreshing called from controller")
        self.refreshControl.endRefreshing()
    }

}

class RefreshTestViewController: UIViewController {

    @IBOutlet var theRefreshableView: RefreshableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        theRefreshableView.setupUI()

        theRefreshableView.refreshFunction = {
            print("simulating refresh for 2 seconds...")
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                [weak self] in
                guard let self = self else { return }
                // do what you want to update the contents of theRefreshableView
                // ...
                // then tell theRefreshableView to endRefreshing
                self.theRefreshableView.endRefreshing()
            }
        }
    }

}

滚动视图的
refreshControl
自动处理拉入刷新功能,因此您不需要任何
scrollViewDidScroll()
代码

假设您的故事板看起来像这样,其中:

  • 红色背景的视图是
    RefreshableView
    类的一个实例
  • 它包含一个滚动视图(通过
    @IBOutlet
    连接)
  • 滚动视图中的一些内容(这里我只有一个标签)

您的代码可以如下所示:

class RefreshableView : UIView {

    @IBOutlet var scrollView: UIScrollView!

    private let refreshControl = UIRefreshControl()

    var refreshFunction: (() -> ())?

    func setupUI() {
        backgroundColor = .gray

        refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)

        scrollView.refreshControl = refreshControl
    }

    @objc func didPullToRefresh() {
        print("calling refreshFunction in controller")
        self.refreshFunction?()
    }

    func endRefreshing() {
        print("end refreshing called from controller")
        self.refreshControl.endRefreshing()
    }

}

class RefreshTestViewController: UIViewController {

    @IBOutlet var theRefreshableView: RefreshableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        theRefreshableView.setupUI()

        theRefreshableView.refreshFunction = {
            print("simulating refresh for 2 seconds...")
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                [weak self] in
                guard let self = self else { return }
                // do what you want to update the contents of theRefreshableView
                // ...
                // then tell theRefreshableView to endRefreshing
                self.theRefreshableView.endRefreshing()
            }
        }
    }

}

谢谢最初我尝试了这个解决方案,但我的问题是我在interface builder中设置了scrollview的高度,这使得使用默认实现很难实现。当我在IB中将viewcontrollers simulated size更改为freeform以设计我的contentview时,我在scrollview上获得了这个高度。我不知道这会影响运行时的视图。谢谢。最初我尝试了这个解决方案,但我的问题是我在interface builder中设置了scrollview的高度,这使得使用默认实现很难实现。当我在IB中将viewcontrollers simulated size更改为freeform以设计我的contentview时,我在scrollview上获得了这个高度。我不知道这会影响运行时的视图。