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

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


person Daniel Robinson    schedule 24.04.2012    source источник


Ответы (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()
}
person Berik    schedule 21.02.2013
comment
Спасибо, я считаю, что UIRefreshControl новый. Я думаю, что сейчас это лучший способ сделать это. - person Daniel Robinson; 24.02.2013
comment
Итак, в основном refreshControl становится заголовком UITableView? - person user4951; 22.10.2013
comment
Отлично и просто. У меня это сработало, когда я попробовал его в табличном представлении, добавленном в UIViewController на iOS 7.0.4. - person thandasoru; 18.02.2014
comment
У кого-нибудь была проблема, когда сам элемент управления не виден, но в остальном, похоже, работает нормально? - person remotevision; 21.03.2014
comment
Не работает должным образом, если у вас положительный верхний контентInset. - person xissburg; 24.04.2014
comment
Представление таблицы кажется неожиданным прыжком вниз после щелчка. Пока не знаю почему. - person Bob Spryn; 25.04.2014
comment
Я обнаружил, что он должен войти в viewdidappear, не уверен, что это функция iOS 7 - я еще не тестировал ее в iOS 8 ... - person Jack Solomon; 14.09.2014
comment
@BobSpryn каждый выясняет, почему он спрыгивает при нажатии. Очень раздражает и заставляет задуматься об использовании UITableViewController. - person Adam Johns; 12.02.2015
comment
Обновить элемент управления отображается поверх tableView. Я исправил это: tableView.insertSubview(refreshControl, atIndex: 0) вместо tableView.addSubview(refreshControl) - person kbpontius; 16.12.2015
comment
элемент управления обновлением не отцентрован - person OMGPOP; 04.01.2016
comment
Если первоначальное смахивание заставляет refreshControl прыгать через tableView, используйте чистый цвет фона refreshControl.backgroundColor = [UIColor clearColor]; Вы по-прежнему будете видеть фон tableViews, поскольку элемент refreshControl находится не над ним, а в init. - person Jakub Truhlář; 04.04.2016
comment
Будьте осторожны с этим методом, если у вас есть заголовки tableview. Заголовки будут плавать под элементом управления обновлением, но содержимое табличного представления будет прокручиваться над элементом управления обновлением, создавая странный эффект. Этого не происходит при установке UIRefreshControl в UITableViewController. - person user3847320; 05.05.2016
comment
Новый способ использования селектора в Swift: #selector (YourClass.refresh) - person CedricSoubrie; 06.07.2016

Цель-C:

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

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];
}
person Manish Methani    schedule 09.08.2016
comment
Как версия obj-c получила только 9 голосов, когда у быстрой версии ›430? - person Chase Roberts; 17.10.2017
comment
@ChaseRoberts, На этот ответ будет дан ответ 13 февраля, взгляните на историю редактирования, изначально она была в объекте-c, так как в то время swift был новым, все искали быструю версию ... stackoverflow.com/posts/15010646/revisions - person Irfan; 30.10.2017

Это решение от @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()
}
person Andres    schedule 04.11.2015
comment
RefreshControl отображается для меня поверх tableView, но ваше предложение заставляет мой refreshControl исчезнуть, а не отображаться под tableView. Я исправил это: tableView.insertSubview (refreshControl, atIndex: 0) вместо tableView.addSubview (refreshControl) - person kbpontius; 16.12.2015

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

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

Надеюсь это поможет.

person Juan Alberto López Cavallotti    schedule 24.04.2012

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

person Giannis Giannopoulos    schedule 31.03.2015

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

person Alex Bin Zhao    schedule 25.05.2017