Search code examples
iosswiftuitableviewuirefreshcontrol

Pull-to-refresh does not work on empty TableView


When I clear all data from datasource and reload the tableView the pull-to-refresh is no more available. How can I enable pull-to-refresh even on an empty tableView?

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    // Pull to refresh for iPhone
    refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)

    tableView.tableFooterView = UIView(frame: CGRectZero) // To remove separator line on empty cells
    tableView.estimatedRowHeight = Constants.DetailTableView.estimatedRowHeight
    tableView.rowHeight = UITableViewAutomaticDimension

    setupRefreshControl()
}

private func setupRefreshControl() {
    // If on iPhone, List becomes the pull-to-refresh handler and the delegate
    if UIScreen.mainScreen().traitCollection.horizontalSizeClass == .Compact {
        SyncService.shared.delegate = self
        refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
        refreshControl?.tintColor = UIColor.whiteColor()
    } else {
        // Otherwise disable the refresh control in List
        refreshControl = nil
    }
}

Solution

  • In the table refresh function I actually have code to display some 'empty table' view to remind the user the tableview is empty and this view was above the tableview's view, hence blocking the interaction. I fixed the view's layers and now it's working. So if you experience the issue in the question, just check whether some view does not overlap your tableview, which was my case here.