Я создаю программу для чтения RSS с использованием swift и мне нужно реализовать функцию pull для перезагрузки.
Вот как я пытаюсь это сделать.
class FirstViewController: UIViewController,
UITableViewDelegate, UITableViewDataSource {
@IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
@IBOutlet var newsCollect: UITableView
var activityIndicator:UIActivityIndicatorView? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.newsCollect.scrollEnabled = true
// Do any additional setup after loading the view, typically from a nib.
if nCollect.news.count <= 2{
self.collectNews()
}
else{
self.removeActivityIndicator()
}
view.addGestureRecognizer(refresh)
}
@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
nCollect.news = News[]()
return newsCollect.reloadData()
}
Я получаю :
Свойство self.refresh не инициализируется при вызове super.init
Пожалуйста, помогите мне понять поведение распознавателей жестов. Рабочий пример кода будет отличной помощью.
Спасибо.
ios
swift
xcode
uirefreshcontrol
xrage
источник
источник
Ответы:
Pull для обновления встроен в iOS. Вы можете сделать это быстро, как
В какой-то момент вы можете закончить освежиться.
источник
Решение с раскадровкой и быстрой ...
1.) Откройте файл .storyboard, выберите TableViewController в вашей раскадровке и «Включите» контроллер табличного представления - функция обновления в утилитах.
2.) Откройте связанный UITableViewController-Class и добавьте следующую строку в viewDidLoad-Method.
Отредактировано для Swift 5.0:
ИЛИ в Swift 2.2:
3.) Добавьте следующий метод выше метода viewDidLoad
источник
put self.tableView.reloadData()
иself.refreshControl?.endRefreshing()
в обратном вызове?reloadData()
в основную очередь, чтобы мгновенно обновить свой пользовательский интерфейс:dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Я хотел бы упомянуть функцию PRETTY COOL , которая была включена с iOS 10, а именно:
На данный момент UIRefreshControl поддерживается напрямую в каждом из
UICollectionView
,UITableView
иUIScrollView
!Каждое из этих представлений имеет свойство экземпляра refreshControl , что означает, что больше нет необходимости добавлять его в качестве подпредставления в представлении прокрутки , все, что вам нужно сделать, это:
Лично я считаю более естественным рассматривать его как свойство для представления прокрутки, а не добавлять его в качестве подпредставления, особенно потому, что единственное подходящее представление в качестве суперпредставления для UIRefreshControl - это представление прокрутки, то есть функциональность использования UIRefreshControl только полезно при работе с видом прокрутки; Вот почему этот подход должен быть более очевидным для настройки представления управления обновлением.
Тем не менее, у вас все еще есть возможность использовать
addSubview
версию на основе iOS:источник
doSomething
функцию, если она достижима, вы должны проверить свой код.Swift 4
И вы можете перестать освежаться с:
источник
tableView.reloadData()
в своем примере!var refControl: UIRefreshControl{ let rfControl = UIRefreshControl() rfControl.attributedTitle = NSAttributedString(string: "") rfControl.tintColor = UIColor(red:0.16, green:0.68, blue:0.9, alpha:1) rfControl.addTarget(self, action: #selector(getNewMessageList), for: .valueChanged) return rfControl }
. Затем вызовите endRefreshing (), это не сработает (по-прежнему там показывает refreshcontrol), но следуйте своему пути, все заработало, пожалуйста, дайте мне знать, почему?.valueChanged
событие? Я не понимаю эту связь.В Swift используйте это,
Если вы хотите, чтобы тянуть, чтобы обновить в WebView,
Так что попробуйте этот код:
источник
Ответ Анхила мне очень помог.
Однако после дальнейших экспериментов я заметил, что предложенное решение иногда вызывает не очень приятный сбой пользовательского интерфейса .
Вместо этого переход на этот подход * сделал свое дело для меня.
* Swift 2.1
источник
Что говорит ошибка, это то, что
refresh
она не инициализирована. Обратите внимание , что вы решили сделатьrefresh
не обязательно, что в Swift означает , что он имеет иметь значение перед вызовомsuper.init
(или это неявно называется, который , кажется, ваш случай). Либо сделайтеrefresh
необязательным (вероятно, то, что вы хотите), либо инициализируйте его каким-либо образом.Я бы посоветовал прочитать вводную документацию Swift еще раз, в которой подробно об этом говорится.
И последнее, что не является частью ответа, как отмечает @Anil, есть встроенный элемент управления обновлением в iOS
UIRefresControl
, который может быть полезен .источник
Я создал приложение для RSS-канала, в котором у меня есть функция обновления по запросу, в которой изначально были некоторые из перечисленных выше проблем.
Но чтобы добавить к ответам пользователей выше, я искал повсюду свой вариант использования и не мог его найти. Я загружал данные из Интернета (RSSFeed), и я хотел, чтобы раскрыть свой список просмотра историй для обновления.
То, что упомянуто выше, покрывает правильные области, но с некоторыми из проблем, с которыми сталкиваются люди, вот то, что я сделал, и это работает удовольствие:
Я воспользовался подходом @Blankarsch и пошел к своей main.storyboard и выбрал табличное представление для использования обновления, тогда не упоминалось о создании IBOutlet и IBAction для эффективного использования обновления.
Надеюсь, что это помогает любому в той же ситуации, что и я
источник
источник
подробности
Характеристики
Решение
использование
Полный образец
источник
Swift 5
источник
Я предлагаю сделать расширение pull To Refresh для использования в каждом классе.
1) Создайте пустой файл Swift: Файл - Новый - Файл - Файл Swift.
2) Добавить следующее
3) В вашем View Controller вызовите эти методы как:
4) В какой-то момент вы хотели закончить обновление:
источник
Для тяги, чтобы обновить, я использую
DGElasticPullToRefresh
https://github.com/gontovnik/DGElasticPullToRefresh
Монтаж
под 'DGElasticPullToRefresh'
переопределить функцию viewWillAppear (_ animated: Bool)
И не забудьте удалить ссылку, пока вид исчезнет
чтобы удалить тягу, чтобы обновить, вставьте этот код в ваш
переопределить функцию viewDidDisappear (_ animated: Bool)
И это будет выглядеть
Удачного кодирования :)
источник
Вы можете достичь этого, используя несколько строк кода. Так почему вы собираетесь застрять в сторонней библиотеке или пользовательском интерфейсе. Pull для обновления встроен в iOS. Вы можете сделать это быстро, как
источник
Вы можете использовать этот подкласс tableView:
1 - в конструкторе интерфейса измените класс вашего tableView
PullToRefreshTableView
или создайтеPullToRefreshTableView
программно2 - реализовать на
PullToRefreshTableViewDelegate
ваш взгляд контроллер3 -
tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
будет вызван в вашем контроллере представления, когда представление таблицы начнет обновляться4 - позвонить,
yourTableView.endRefreshing()
чтобы закончить обновлениеисточник
Вот как я заставил это работать, используя Xcode 7.2, который я считаю серьезной ошибкой. Я использую это
UITableViewController
внутри моегоviewWillAppear
Как видите, я буквально должен вызывать
configureMessage()
метод после настройки своегоUIRefreshControl
then после этого, последующие обновления будут работать нормально.источник
Другие ответы верны, но для более подробной информации проверьте это сообщение Потяните, чтобы обновить
Когда вы работаете с UITableViewController, решение довольно простое: во-первых, выберите контроллер табличного представления в раскадровке, откройте инспектор атрибутов и включите обновление:
UITableViewController поставляется со ссылкой на UIRefreshControl из коробки. Вам просто нужно подключить несколько вещей, чтобы начать и завершить обновление, когда пользователь отключается.
В переопределении viewDidLoad () добавьте цель для обработки обновления следующим образом:
refreshControl.endRefreshing()
Для получения дополнительной информации, пожалуйста, перейдите по ссылке Ссылка и все кредиты идут на этот пост
источник