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