Marco Castano
Marco Castano

Reputation: 1154

How to continue animate refresh control on view changed

I have a table in view "A" that is inside a tab bar controller. When I scroll down to reload the table refresh control start animating.When press tab bar controller going in view "B" and later go back to view "A", refresh control is visible but isn't animating.

Can someone help me? thank

func refresh(sender:AnyObject)
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in

    Call API for data
    dispatch_async(dispatch_get_main_queue(), { () -> Void in

                UPDATE UI
                refreshControl.endRefreshing()

            })
        });
}

override func viewDidAppear(animated: Bool)
{
    if(requestTerminated == false)
    {
       //Continue animate refresh control somehow
    }
}

Upvotes: 1

Views: 1198

Answers (1)

Alessandro Ornano
Alessandro Ornano

Reputation: 35372

Suppose you have this situation in your controller A , for example in viewDidLoad:

//global var
var refreshControl:UIRefreshControl!

self.refreshControl = UIRefreshControl()
self.refreshControl.attributedTitle = NSAttributedString(string: "pull to refresh")
self.refreshControl.addTarget(self, action: #selector(MyTableViewController.pullToRefresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl)

As can you see you have your refreshControl add as a subview to your A table controller. When you go to another controller probably you present another controller (B) and when you come back to A your refresh is freezed or stucked.

You could start UIRefreshControl animation on viewWillAppear and end it on viewDidDisappear. During transition save the state of refresh process to know when to show UIRefreshControl.

You can use a boolean like this:

// Refresh state
var isRefreshing = false

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

// Call on viewDidDisapper
func superviewDidDisappear(){
    endRefreshAnimation(false, dataFetched: !isRefreshing)
}

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

    isRefreshing = true
}

//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)
    }
}

Upvotes: 1

Related Questions