Потяните, чтобы обновить в 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()
 }