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

180

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

Даниэль Робинсон
источник

Ответы:

465

Добавить элемент управления обновлением непосредственно в 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()
}
Берик
источник
1
Отлично и просто. Это работает для меня, когда я попробовал это на табличном представлении, добавленном к UIViewController на iOS 7.0.4.
thandasoru
5
У кого-нибудь была проблема, когда сам элемент управления не виден, но в остальном вроде бы работает нормально?
дистанционное наблюдение
16
Кажется, что табличное представление неожиданно спрыгивает, как только оно «щелкает». Пока не знаю почему.
Боб Сприн
3
Я обнаружил, что он должен идти в viewdidappear, не уверен, что это функция iOS 7 - я еще не тестировал ее в iOS 8 ...
Джек Соломон
4
RefreshControl появляется в верхней части tableView. Я исправил это: tableView.insertSubview(refreshControl, atIndex: 0)вместоtableView.addSubview(refreshControl)
kbpontius
12

Цель-C :

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

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];
}
Маниш Метани
источник
Как версия obj-c имеет только 9 голосов, если версия swift имеет> 430?
Чейз Робертс
1
@ChaseRoberts, на этот вопрос ответили 13 февраля, взгляните на историю редактирования, изначально это было в target-c, поскольку в то время swift был новым, каждый искал версию swift ... stackoverflow.com/posts / 15010646 / редакция
Ирфан
4

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

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

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

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

Хуан Альберто Лопес Каваллотти
источник
-1

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

Яннис Джаннопулос
источник
-1

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

Алекс Бин Чжао
источник