Потяните, чтобы обновить UITableView без UITableViewController


Я пытаюсь реализовать функцию pull To refresh в UITableView в UIViewController. Я не могу использовать UITableViewController, потому что я хочу, чтобы UITableView был меньшим подвидом в контроллере вида, с некоторыми другими вещами над ним. Я предполагаю, что это возможно, но кто-нибудь видел его реализацию?

6 173

6 ответов:

добавить элемент управления обновлением непосредственно в UITableView без использования UITableViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

С:

вот как вы можете реализовать pull для обновления для табличного представления. То же самое, что и в случае представления коллекции. Просто заменить вид таблицы, выделено с представления коллекции.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}

это решение от @berik работает нормально, но UIController отображается поверх UITableViewController. Способ исправить это делает это изменение:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

я реализовал EGORefreshTableHeaderView с помощью UIViewController и простого табличного представления, трюк заключается в том, что в тех местах, где EGO принимает вид прокрутки в качестве параметра, если вы посмотрите, что само табличное представление наследуется от вида прокрутки.

для этого требуется только это и несколько дополнительных соединений:)

надеюсь, что это помогает.

кажется, что если вы создадите UIRefreshControl внутри viewController loadView метод все работает нормально. UIRefreshControl ведет себя так, как должен. Протестировано на iOS 7.1 и iOS 8.2

Я в конечном итоге с помощью ODRefreshControl. Он не нуждается в какой-либо хак, как выше tableView.backgroundView = refreshControl, работает почти так же, и дает более красивый интерфейс.