Ios UIRefreshControl在以编程方式触发时不刷新

Ios UIRefreshControl在以编程方式触发时不刷新,ios,swift,uirefreshcontrol,Ios,Swift,Uirefreshcontrol,我试图在视图加载时显示刷新控件,以显示我正在从解析中获取数据。刷新控件在应用程序运行时正常工作,但我无法从应用程序中的任何位置以编程方式启动它。 这是似乎未运行的代码: override func viewDidAppear(animated: Bool) { self.refresher.beginRefreshing() } 这不仅不会运行,而且应用程序中的代码会更改刷新控件的属性。当我在应用程序中有此代码,并从用户交互中显示刷新器时,刷新控件没有其属性标题,因为它通常没有,也

我试图在视图加载时显示刷新控件,以显示我正在从解析中获取数据。刷新控件在应用程序运行时正常工作,但我无法从应用程序中的任何位置以编程方式启动它。 这是似乎未运行的代码:

 override func viewDidAppear(animated: Bool) {
    self.refresher.beginRefreshing()
 }

这不仅不会运行,而且应用程序中的代码会更改刷新控件的属性。当我在应用程序中有此代码,并从用户交互中显示刷新器时,刷新控件没有其属性标题,因为它通常没有,也没有运行它应该运行的代码。

我需要在setContentOffset和
self.refreshControl?之间添加延迟。sendActions(for:.valueChanged)
调用。如果没有延迟,refreshControl的AttributeTitle将不会呈现

这适用于iOS 10(Swift 3):


下面是10.3的扩展:

extension UIRefreshControl {
    func refreshManually() {
        if let scrollView = superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height), animated: false)
        }
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}

检查此问题/答案我尝试了您的解决方案,但没有设置动画。第一个
self.tableView.setContentOffset(CGPoint(x:0,y:self.tableView.contentOffset.y-(self.refreshControl!.frame.size.height)),动画:true)
+
self.refreshControl?.beginRefreshing()
在iOS 10上适用。不需要sendActions电话,谢谢。没有延迟,标题就不会出现!我很惊讶没有人提出这个问题:我建议直接调用所需的方法,而不是通过
sendActions(for:)
method使用目标操作。对我来说,这似乎是一个解决方法-如果可以立即完成所有必要的工作,为什么要等待0.2秒(或任何时间量)?sendAction(for:)导致了一个递归调用,该调用创建了意外行为,使方法本身递归调用。除此之外,扩展工作得很好。
extension UIRefreshControl {
    func refreshManually() {
        if let scrollView = superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height), animated: false)
        }
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}