Просто любопытно, так как это сразу не представляется возможным, но есть ли хитрый способ использовать новый UIRefreshControl
класс iOS 6 без использования UITableViewController
подкласса?
Я часто использую UIViewController
с UITableView
подвид и соответствовать UITableViewDataSource
и , UITableViewDelegate
а не с помощью UITableViewController
наповал.
UITableViewController
и сообщить об ошибке, запрашивая API для непосредственного использованияUIRefreshControl
aUITableView
.Ответы:
По догадкам и на основе вдохновения DrummerB я попытался просто добавить
UIRefreshControl
экземпляр в качестве подпредставления к своемуUITableView
. И это волшебным образом работает!Это добавляет
UIRefreshControl
выше табличное представление и работает, как и ожидалось, без использованияUITableViewController
:)РЕДАКТИРОВАТЬ: Это выше по-прежнему работает, но, как отмечают некоторые, есть небольшое «заикание» при добавлении UIRefreshControl таким образом. Решением этого является создание экземпляра UITableViewController, а затем установка для него ваших UIRefreshControl и UITableView, то есть:
источник
-[UITableViewController setRefreshControl:]
) продолжит функционировать.handleRefresh:
происходит неожиданное изменение значения представления прокрутки вcontentInsets
течение доли секунды. Кто-нибудь еще испытал это или исправил это? (да, я знаю, что это в первую очередь не поддерживается!)UITableViewController
и вы будете «делать все правильно».[_tableView insertSubview:_refreshControl atIndex:0];
. Протестировано с iOS 7 и 8;)Чтобы устранить заикание, вызванное принятым ответом, вы можете присвоить свой
UITableView
aUITableViewController
.РЕДАКТИРОВАТЬ:
Способ добавить
UIRefreshControl
без,UITableViewController
без заикания и сохранить хорошую анимацию после обновления данных в табличном представлении.Позже при обработке обновленных данных ...
источник
[_tablewViewController didMoveToParentViewController:self];
после добавления подпредставления.self.tableView = _tableViewController.tableView;
должно быть_tableViewController.tableView = self.tableView
То, что вы попробуете, это использовать представление контейнера внутри ViewController, который вы используете. Вы можете определить чистый подкласс UITableViewController с выделенным табличным представлением и поместить его в ViewController.
источник
self.childViewControllers.firstObject
.prepareForSegue
для получения ссылки на объект UITableViewController в представлении контейнера, так как это немедленно запускается как событие segue при создании экземпляра из раскадровки.Ну, UIRefreshControl - это подкласс UIView, так что вы можете использовать его самостоятельно. Я не уверен, хотя, как это отрисовывает себя. Рендеринг может просто зависеть от фрейма, но он также может полагаться на UIScrollView или UITableViewController.
В любом случае, это будет скорее взлом, чем элегантное решение. Я рекомендую вам взглянуть на один из доступных сторонних клонов или написать свой собственный.
ODRefreshControl
SlimeRefresh
источник
Попробуйте отложить вызов
-endRefresh
метода refreshControl на долю секунды после того, как tableView перезагрузит свое содержимое, используя NSObject-performSelector:withObject:afterDelay:
или GCDdispatch_after
.Я создал категорию на UIRefreshControl для этого:
Я проверил это, и это также работает на коллекцию просмотров. Я заметил, что задержка в 0,01 секунды достаточно:
источник
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
или GCD для этого - дело личного вкуса.это просто
Если вы хотите узнать о iOS 10 UIRefreshControl, прочитайте здесь .
источник
Добавление элемента управления обновлением в качестве подпредставления создает пустое пространство над заголовками раздела.
Вместо этого я встроил UITableViewController в свой UIViewController, а затем изменил свой
tableView
свойство, чтобы оно указывало на встроенное, и альт! Минимальные изменения кода. :-)шаги:
@IBOutlet weak var tableView: UITableView!
на один из недавно встроенного UITableViewController, как показано нижеисточник
Для Swift 2.2.
Сначала создайте UIRefreshControl ().
В вашем методе viewDidLoad () добавьте:
И сделать функцию обновления
источник
Вот еще одно решение, которое немного отличается.
Мне пришлось использовать его из-за некоторых проблем с иерархией представлений, которые у меня были: я создавал некоторые функциональные возможности, которые требовали передачи представлений в разные места в иерархии представлений, которые ломались при использовании табличного представления UITableViewController, поскольку tableView является корневым представлением UITableViewController ( self.view), а не просто обычное представление, оно создало противоречивые иерархии контроллера / представления и вызвало сбой.
По сути, создайте свой собственный подкласс UITableViewController и переопределите loadView, чтобы назначить self.view другое представление, и переопределите свойство tableView для возврата отдельного представления таблицы.
например:
В сочетании с решением Келлера это будет более устойчивым в том смысле, что tableView теперь является обычным представлением, а не корневым представлением VC, и будет более устойчивым к изменению иерархий представлений. Пример использования этого способа:
Существует еще одно возможное использование для этого:
Так как создание подклассов таким способом отделяет self.view от self.tableView, теперь возможно использовать этот UITableViewController в качестве более обычного контроллера и добавлять другие подпредставления в self.view без странностей добавления подпредставлений в UITableView, поэтому можно рассмотреть возможность создания их просматривать контроллеры непосредственно подкласс UITableViewController вместо того, чтобы иметь дочерние UITableViewController.
Некоторые вещи, на которые стоит обратить внимание:
Так как мы переопределяем свойство tableView, не вызывая super, могут быть некоторые вещи, на которые следует обратить внимание, и которые необходимо обработать при необходимости Например, установка tableview в моем примере выше не добавит tableview к self.view и не установит кадр, который вы, возможно, захотите сделать. Кроме того, в этой реализации нет табличного представления по умолчанию, предоставленного вам при создании экземпляра класса, что также можно рассмотреть при добавлении. Я не включаю это здесь, потому что это в каждом конкретном случае, и это решение действительно хорошо согласуется с решением Келлера.
источник
Попробуй это,
Вышеуказанные решения хороши, но tableView.refreshControl доступен только для UITableViewController до iOS 9.x и поставляется в UITableView начиная с iOS 10.x и далее.
Написано в Swift 3 -
источник
Первое предложение Келлера вызывает странную ошибку в iOS 7, когда вкладка таблицы увеличивается после появления контроллера представления. Переход ко второму ответу с помощью контроллера uitableview позволил мне все исправить.
источник
Оказывается, вы можете использовать следующее при использовании UIViewController с подпредставлением UITableView и соответствуйте UITableViewDataSource и UITableViewDelegate:
источник
self.refreshControl
это свойство для, аUITableViewController
неUIViewController
.