在UITabBarController中切换选项卡后,UIRefreshControl卡住了

dia*_*nos 26 iphone refresh objective-c ios uirefreshcontrol

我有一个UITableViewController作为UINavigationController中的根视图控制器,UINavigationController又是UITabBarController中的一个视图控制器.所有人都在故事板中.

我也在Storyboard中为我的表配置了UIRefreshControl,通常看起来应该在拉动时:

正常的UIRefreshControl

但是,如果我在其他标签之间切换一次或两次,它看起来像这样:

越野车UIRefreshControl

它不是旋转或任何东西,只是卡住"满",它一直保持这种状态,直到我完全拉动并触发刷新.

任何想法或建议都会欣赏.

小智 12

user2009606几乎是正确的,我通过调用修复它

[refreshControl endRefreshing];
Run Code Online (Sandbox Code Playgroud)

viewWillAppear:
Run Code Online (Sandbox Code Playgroud)

切换选项卡后,refreshControl现在可以正常运行,与其状态无关.


dia*_*nos 11

我知道这已经非常晚了,但是我觉得迟到总比没有好.

不幸的是,没有一个给定的答案对我有用.唯一有用的是viewWillAppear中的这段可怕的代码:

self.refreshControl = nil;
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refreshFunction) forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Run Code Online (Sandbox Code Playgroud)

基本上,每次视图出现时我都会重新创建UIRefreshControl.虽然在发出以下警告时它仍然有效:

强烈建议不要在空闲时更改刷新控件,否则可能无法正常工作.

我真的很惊讶这仍然是一个问题(现在仍然在iOS 9中看到这个).希望这可能对其他人有所帮助.


Iva*_*Rep 5

总结并提供完整的解决方案。

问题:

如果UIRefreshControl在屏幕过渡期间处于动画状态,则它将保持可见但不会处于动画状态。视频https://vid.me/Bkb7

此外,如果拉动刷新动画已开始但尚未完成,然后执行了过渡,则UIRefreshControl将被隐藏但被卡住。视频https://vid.me/Bkb7

解:

在viewWillAppear上启动UIRefreshControl动画,并在viewDidDisappear上结束动画。保存刷新过程的状态,以了解何时显示UIRefreshControl。

贝娄是整个解决方案,还可以处理正确的动画和简单的拉动以刷新动画。

添加到UITableView或子类

初始化:

 /// Refresh indicator
var refreshControl = UIRefreshControl()

/// Refresh state
var isRefreshing = false

/// Refresh controll update funcion. Set to enable pull to refresh
var refreshControllUpdateFunction: (() -> ())?

/// Prepeares UIRefreshControll. Call from init
func initRefreshControl(){
    addSubview(refreshControl)

    refreshControl.addTarget(self, action: "refreshControllTarget", forControlEvents: .ValueChanged)
    refreshControl.beginRefreshing()

    isRefreshing = true
}
Run Code Online (Sandbox Code Playgroud)

Superview事件处理程序:

/// Call on viewWillApper
func superviewWillApper(){
    if isRefreshing && !refreshControl.refreshing{
        startRefreshAnimation()
    }
}

/// Call on viewDidDisapper
func superviewDidDisappear(){
    endRefreshAnimation(false, dataFetched: !isRefreshing)
}
Run Code Online (Sandbox Code Playgroud)

UIRefreshControl动画处理程序:

/// Presents animating UIRefreshControll
func startRefreshAnimation(){
    refreshControl.beginRefreshing()
    contentOffset = CGPointMake(0, -refreshControl.bounds.size.height)

    isRefreshing = true
}

/// Hides UIRefreshControll and saves state of refresh
func endRefreshAnimation(wasEmpty: Bool, dataFetched: Bool){
    refreshControl.endRefreshing()

    isRefreshing = !dataFetched

    if !wasEmpty{
        setContentOffset(CGPointZero, animated: true)
    }else{
        setContentOffset(CGPointZero, animated: false)
    }
}
Run Code Online (Sandbox Code Playgroud)

table.isRefreshing = true
Run Code Online (Sandbox Code Playgroud)

开始刷新呼叫。

结果视频https://vid.me/LyuI