Потягніть, щоб оновити 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
Я виявив, що йому потрібно переглядатись, не впевнений, чи це функція iOS 7 - я ще перевіряю її в iOS 8 ...
Джек Соломон

4
RefreshControl з'являється вгорі таблиціView. Я зафіксував це за допомогою: tableView.insertSubview(refreshControl, atIndex: 0)замістьtableView.addSubview(refreshControl)
kbpontius

12

Завдання-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];
}

Як версія obj-c має лише 9 оновлених версій, коли версія swift> 430?
Чейз Робертс

1
@ChaseRoberts, на що відповіли 13 лютого, погляньте на історію редагування, спочатку це було в aim-c, оскільки в той час швидкий був новий, кожен шукав швидку версію ... 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()
}

3
RefreshControl з'являється вгорі tableView для мене, але ваша пропозиція змушує мене refreshControlзникати, а не відображатись нижче tableView. Я виправив це за допомогою: tableView.insertSubview (refreshControl, atIndex: 0) замість tableView.addSubview (refreshControl)
kbpontius

3

Я реалізував EGORefreshTableHeaderView з UIViewController та простим переглядом таблиці, хитрість полягає в тому, що a в місцях, де EGO приймає вигляд прокрутки, як параметр, якщо ви дивитесь, що сам вид таблиці успадковується від подання прокрутки.

Це вимагає лише цього і кілька додаткових підключень :)

Сподіваюся, це допомагає.


-1

Здається, що якщо ви створите UIRefreshControl всередині методу loadView viewController, все працює добре. UIRefreshControl поводиться як слід. Тестовано на iOS 7.1 та iOS 8.2


-1

Я в кінцевому рахунку використовував ODRefreshControl . Він не потребує жодного злому, як описано вище tableView.backgroundView = refreshControl, працює майже так само і дає кращий зовнішній інтерфейс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.