Потяните, чтобы обновить в UICollectionView в ViewController
Я использовал следующий код в UICollectionViewController
override func viewDidLoad() {
self.collectionView!.alwaysBounceVertical = true
let refresher = UIRefreshControl()
refresher.addTarget(self, action: "refreshStream", forControlEvents: .ValueChanged)
refreshControl = refresher
collectionView!.addSubview(refreshControl!)
}
func refreshStream() {
print("refresh")
self.collectionView?.reloadData()
refreshControl?.endRefreshing()
}
Теперь мне нужно, чтобы он работал с UICollectionView
внутри a UIViewController
, и я googled в течение часа, но не могу заставить его работать.
Я ценю любую помощь.
Ответы
Ответ 1
На раскадровке вам нужно связать представление коллекции с соответствующим файлом контроллера, используя Ctrl + Drag из объекта коллекции. Его нужно связать с помощью @IBOutlet.
Кроме того, вы должны Ctrl + перетащить из представления коллекции в объект контроллера представления в раскадровке и выбрать источник данных и делегировать, чтобы представление коллекции было правильно связано.
Сообщите мне, помогает ли это, или я неправильно понял вашу ситуацию.
Ответ 2
Новый вызываемый код изменен в вызывающем методе действия, который вы можете переписать следующим образом:
@IBOutlet weak var collectionView: UICollectionView!
var refresher:UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
self.refresher = UIRefreshControl()
self.collectionView!.alwaysBounceVertical = true
self.refresher.tintColor = UIColor.red
self.refresher.addTarget(self, action: #selector(loadData), for: .valueChanged)
self.collectionView!.addSubview(refresher)
}
func loadData() {
self.collectionView!.refreshControl.beginRefreshing()
//code to execute during refresher
.
.
.
stopRefresher() //Call this to stop refresher
}
func stopRefresher() {
self.collectionView!.refreshControl.endRefreshing()
}
Ответ 3
var refreshControl:UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
self.refreshControl = UIRefreshControl()
self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl.addTarget(self, action: #selector(PricingPlansCollectionViewController.reload), for: .valueChanged)
collectionView!.addSubview(refreshControl)
}
func refresh(sender:AnyObject)
{
//DO
}
Ответ 4
Решение Swift 5
Как уже упоминалось @fishspy, это способ поместить представление вашей коллекции в контроллер представления, но я также поделюсь с вами, как более чистым способом подключить элемент управления обновлением к представлению коллекции.
Начиная с iOS 10 есть выделенное свойство для элемента управления обновлением. Кроме того, я бы также рекомендовал напрямую инициализировать элемент управления обновлением как свойство, объявив его закрытым и выполнив следующие действия:
@IBOutlet private weak var collectionView: UICollectionView!
private let refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.addTarget(self, action: #selector(didPullToRefresh(_:)), for: .valueChanged)
collectionView.alwaysBounceVertical = true
collectionView.refreshControl = refreshControl // iOS 10+
}
@objc
private func didPullToRefresh(_ sender: Any) {
// Do you your api calls in here, and then asynchronously remember to stop the
// refreshing when you've got a result (either positive or negative)
refreshControl.endRefreshing()
}
Ответ 5
private let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(youFunction), for: .valueChanged)
refreshControl.tintColor = UIColor.red
refreshControl.attributedTitle = NSAttributedString(string: "Fetchin Data ...", attributes: nil)
DispatchQueue.main.async {
self.refreshControl.endRefreshing()
yourCollectionViewOrTableView.reloadData()
}