刷新控件的目标动作未被触发

8

我的视图控制器有一个表格视图,在其中我将我的视图填充到不同的部分中。我正在尝试向这个表格视图添加一个刷新控件。我实现的代码如下:

func setUpRefreshControl() {
    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor.red
    refreshControl.addTarget(self, action: #selector(handleRefresh(_: )), for: UIControlEvents.valueChanged)
    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.addSubview(refreshControl)
    }
}


@objc func handleRefresh(_ sender: UIRefreshControl) {
   print("-----------REFRESHED------------")
}

接下来,当我下拉tableview以刷新时,刷新控件(设置为红色)是可见的。然而,目标函数未被调用。
我的视图控制器在选项卡控制器中,并嵌入导航控制器中。我猜问题与视图层次结构有关,因为当我在一个没有导航栏和选项卡的单独项目中尝试相同的代码时,它可以正常工作。但我无法弄清楚当前的问题是什么。有什么建议可以解决这个问题吗?谢谢。
编辑:我在不同的模拟器中进行了测试:6, 6s, 6s+, 7, 7+, 8, 8+, X。我发现上面的代码在所有plus版本包括X中都可以正常运行。然而,所有模拟器都在运行ios 11.2,所以我仍然无法弄清楚可能导致这个问题的原因。

如果您能看到红色的刷新控件,我认为视图层次结构没有问题。您可以尝试将该刷新控件属性设置为全局,以进行检查。 - Prashant Tukadiya
你可以在顶部栏下取消勾选,并从Storyboard中调整自动滚动视图插入来尝试。 - Prashant Tukadiya
没有起作用@PrashantTukadiya,我尝试将刷新控件作为全局变量并尝试更改滚动内容插图。 - Sujal
3个回答

10

我遇到了类似的问题,下拉刷新在5.5英寸的屏幕上运行良好,但其他手机却只显示部分动画,然后无法触发刷新。

我发现在我的视图控制器的viewDidAppear中调用refreshControl.didMoveToSuperview()可以解决这个问题。

如果我理解正确,当你设置tableView.refreshControl = refreshControl时,同样会调用这个方法,但需要在视图实际出现之前重新计算。我需要进一步深入研究才能确定具体细节,但希望目前对您有所帮助。


这对我来说解决了问题。 - Wyetro

8

我通过将模拟指标中的大小属性更改为推断,并将视图控制器中的模拟大小属性更改为固定,解决了此问题。

希望这对您有用。


为了既使用自定义模拟大小,又让刷新控件调用刷新方法,请添加thetonewolf提出的解决方案:在viewdidappear中调用refreshControl.didMoveToSuperview()。 - Andrea Leganza

1
这是我在三天前在我的当前项目中实现并且正常工作的刷新控件代码。
这是我的全局refreshControl变量,下面是它的实现。
    //MARK: - REFRESH CONTROLLER VIEW
    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(refresh(_ :)), for: UIControlEvents.valueChanged)
    refreshControl.attributedTitle = NSAttributedString(string: "")
    tblRequest.addSubview(refreshControl)

希望这对您有用!:-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接