Как использовать pull для обновления в Swift?

248

Я создаю программу для чтения 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

Пожалуйста, помогите мне понять поведение распознавателей жестов. Рабочий пример кода будет отличной помощью.

Спасибо.

xrage
источник
Вы хотите, чтобы обновление обновляло в табличном представлении
Анил Варгезе
Да, мне нужна только эта функциональность, но я понятия не имею о ObjC. Хотите реализовать в кратчайшие сроки.
xrage

Ответы:

591

Pull для обновления встроен в iOS. Вы можете сделать это быстро, как

var refreshControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
   tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender: AnyObject) {
   // Code to refresh table view  
}

В какой-то момент вы можете закончить освежиться.

refreshControl.endRefreshing()
Анил Варгезе
источник
15
Спасибо! Я использовал это. Просто некоторые настройки для ленивой загрузки. Я хотел бы сделать: "lazy var refreshControl = UIRefreshControl ()" Я считаю хорошей практикой избегать принудительного развертывания переменных, так как кажется, что это нарушает безопасность языка.
nmdias
10
Просто быстрое примечание, вам даже не нужно добавлять refreshControl в представление таблицы. Это обрабатывается неявно.
Кендрик Ледет
1
@KendrickLedet, даже если вы не используете UITableViewController?
Ван Ду Тран
3
Как бы я мог использовать это решение для верхней части таблицы и внизу?
Остин
3
Обновление Swift 4: refreshControl.addTarget (self, action: "refresh:", для: .valueChanged)
Аксели
149

Решение с раскадровкой и быстрой ...

1.) Откройте файл .storyboard, выберите TableViewController в вашей раскадровке и «Включите» контроллер табличного представления - функция обновления в утилитах.

введите описание изображения здесь

2.) Откройте связанный UITableViewController-Class и добавьте следующую строку в viewDidLoad-Method.

self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)

Отредактировано для Swift 5.0:

self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)

ИЛИ в Swift 2.2:

self.refreshControl?.addTarget(self, action: #selector(TestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)

3.) Добавьте следующий метод выше метода viewDidLoad

func refresh(sender:AnyObject)
{
    // Updating your data here...

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}
пустой
источник
7
Кроме того, вы можете добавить действие обновления с раскадровкой, перетащив элемент управления из элемента управления «Обновить» в раскадровке на свой ViewController
uiureo
Если мои данные загрузки асинхронные, я должен put self.tableView.reloadData()и self.refreshControl?.endRefreshing()в обратном вызове?
Цянь Чен
Именно! И поместите его reloadData()в основную очередь, чтобы мгновенно обновить свой пользовательский интерфейс: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Пустой
1
Этот способ предпочтительнее принятого ответа по той причине, что в нем нет ошибок макета (по крайней мере, для меня, используя swift 2+)
Райан Уолтон,
1
Этот ответ должен иметь наибольшее количество голосов и быть правильным
krummens
75

Я хотел бы упомянуть функцию PRETTY COOL , которая была включена с iOS 10, а именно:

На данный момент UIRefreshControl поддерживается напрямую в каждом из UICollectionView, UITableViewи UIScrollView!

Каждое из этих представлений имеет свойство экземпляра refreshControl , что означает, что больше нет необходимости добавлять его в качестве подпредставления в представлении прокрутки , все, что вам нужно сделать, это:

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()

    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(doSomething), for: .valueChanged)

    // this is the replacement of implementing: "collectionView.addSubview(refreshControl)"
    collectionView.refreshControl = refreshControl
}

func doSomething(refreshControl: UIRefreshControl) {
    print("Hello World!")

    // somewhere in your code you might need to call:
    refreshControl.endRefreshing()
}

Лично я считаю более естественным рассматривать его как свойство для представления прокрутки, а не добавлять его в качестве подпредставления, особенно потому, что единственное подходящее представление в качестве суперпредставления для UIRefreshControl - это представление прокрутки, то есть функциональность использования UIRefreshControl только полезно при работе с видом прокрутки; Вот почему этот подход должен быть более очевидным для настройки представления управления обновлением.

Тем не менее, у вас все еще есть возможность использовать addSubviewверсию на основе iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}
Ахмад Ф
источник
Эй, чувак, что я называю в функции doSomething? если я вызываю reload. Data не хочет загружаться снова!
@JavierV. добавьте точку останова в doSomethingфункцию, если она достижима, вы должны проверить свой код.
Ахмад Ф
50

Swift 4

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    tableView.addSubview(refreshControl) 
}

@objc func refresh(_ sender: Any) {
    //  your code to reload tableView
}

И вы можете перестать освежаться с:

refreshControl.endRefreshing()
Гилад Брунфман
источник
Не забудьте упомянуть tableView.reloadData()в своем примере!
Константинос Натсиос
Привет Я создаю мой refreshcontrol этим способом: 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), но следуйте своему пути, все заработало, пожалуйста, дайте мне знать, почему?
Ли
@lee Потому что rfControl локальный и не имеет доступа извне. Попробуйте инициализировать rfControl как глобальную переменную для VC: var rfControl = UIRefreshControl () и остановитесь с помощью rfControl.endRefreshing ()
Gilad
Вопрос: где происходит .valueChangedсобытие? Я не понимаю эту связь.
juniorgarcia
когда срабатывает UIRefreshControl, как вы видите, когда добавляете addTarget: refreshControl.addTarget (self, action: #selector (self.refresh), для: UIControlEvents.valueChanged)
Гилад
9

В Swift используйте это,

Если вы хотите, чтобы тянуть, чтобы обновить в WebView,

Так что попробуйте этот код:

override func viewDidLoad() {
    super.viewDidLoad()
    addPullToRefreshToWebView()
}

func addPullToRefreshToWebView(){
    var refreshController:UIRefreshControl = UIRefreshControl()

    refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
    refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
    refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
    YourWebView.scrollView.addSubview(refreshController)

}

func refreshWebView(refresh:UIRefreshControl){
    YourWebView.reload()
    refresh.endRefreshing()
}
Мухаммед Заид Патан
источник
Спасибо, сэр! Решил проблему с нубом, с которой я столкнулся во время обучения.
Адриан Дэвид Смит
5

Ответ Анхила мне очень помог.

Однако после дальнейших экспериментов я заметил, что предложенное решение иногда вызывает не очень приятный сбой пользовательского интерфейса .

Вместо этого переход на этот подход * сделал свое дело для меня.

* Swift 2.1

//Create an instance of a UITableViewController. This will host your UITableView.
private let tableViewController = UITableViewController()

//Add tableViewController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableViewController)
self.tableViewController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableViewController.refreshControl = self.refreshControl
Leverin
источник
2

Что говорит ошибка, это то, что refreshона не инициализирована. Обратите внимание , что вы решили сделать refreshне обязательно, что в Swift означает , что он имеет иметь значение перед вызовом super.init(или это неявно называется, который , кажется, ваш случай). Либо сделайте refreshнеобязательным (вероятно, то, что вы хотите), либо инициализируйте его каким-либо образом.

Я бы посоветовал прочитать вводную документацию Swift еще раз, в которой подробно об этом говорится.

И последнее, что не является частью ответа, как отмечает @Anil, есть встроенный элемент управления обновлением в iOS UIRefresControl, который может быть полезен .

JustSid
источник
2

Я создал приложение для RSS-канала, в котором у меня есть функция обновления по запросу, в которой изначально были некоторые из перечисленных выше проблем.

Но чтобы добавить к ответам пользователей выше, я искал повсюду свой вариант использования и не мог его найти. Я загружал данные из Интернета (RSSFeed), и я хотел, чтобы раскрыть свой список просмотра историй для обновления.

То, что упомянуто выше, покрывает правильные области, но с некоторыми из проблем, с которыми сталкиваются люди, вот то, что я сделал, и это работает удовольствие:

Я воспользовался подходом @Blankarsch и пошел к своей main.storyboard и выбрал табличное представление для использования обновления, тогда не упоминалось о создании IBOutlet и IBAction для эффективного использования обновления.

//Created from main.storyboard cntrl+drag refresh from left scene to assistant editor
@IBOutlet weak var refreshButton: UIRefreshControl

override func viewDidLoad() {
  ...... 
  ......
  //Include your code
  ......
  ......
  //Is the function called below, make sure to put this in your viewDidLoad 
  //method or not data will be visible when running the app
  getFeedData()
}

//Function the gets my data/parse my data from the web (if you havnt already put this in a similar function)
//remembering it returns nothing, hence return type is "-> Void"
func getFeedData() -> Void{
  .....
  .....
}

//From main.storyboard cntrl+drag to assistant editor and this time create an action instead of outlet and 
//make sure arguments are set to none and note sender
@IBAction func refresh() {
  //getting our data by calling the function which gets our data/parse our data
  getFeedData()

  //note: refreshControl doesnt need to be declared it is already initailized. Got to love xcode
  refreshControl?.endRefreshing()
}

Надеюсь, что это помогает любому в той же ситуации, что и я

Дом Брайан
источник
2
func pullToRefresh(){

    let refresh = UIRefreshControl()
    refresh.addTarget(self, action: #selector(handleTopRefresh(_:)), for: .valueChanged )
    refresh.tintColor = UIColor.appBlack
    self.tblAddressBook.addSubview(refresh)

}
@objc func handleTopRefresh(_ sender:UIRefreshControl){
    self.callAddressBookListApi(isLoaderRequired: false)
    sender.endRefreshing()
}
Hiren
источник
2

подробности

  • Xcode Version 10.3 (10G8), Swift 5

Характеристики

  • Возможность сделать "тянуть, чтобы обновить" программно
  • Защита от нескольких событий «тянуть, чтобы обновить»
  • Возможность продолжить анимацию индикатора активности при переключении контроллера вида (например, в случае TabController)

Решение

import UIKit

class RefreshControl: UIRefreshControl {

    private weak var actionTarget: AnyObject?
    private var actionSelector: Selector?
    override init() { super.init() }

    convenience init(actionTarget: AnyObject?, actionSelector: Selector) {
        self.init()
        self.actionTarget = actionTarget
        self.actionSelector = actionSelector
        addTarget()
    }

    private func addTarget() {
        guard let actionTarget = actionTarget, let actionSelector = actionSelector else { return }
        addTarget(actionTarget, action: actionSelector, for: .valueChanged)
    }

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }

    func endRefreshing(deadline: DispatchTime? = nil) {
        guard let deadline = deadline else { endRefreshing(); return }
        DispatchQueue.global(qos: .default).asyncAfter(deadline: deadline) { [weak self] in
            DispatchQueue.main.async { self?.endRefreshing() }
        }
    }

    func refreshActivityIndicatorView() {
        guard let selector = actionSelector else { return }
        let _isRefreshing = isRefreshing
        removeTarget(actionTarget, action: selector, for: .valueChanged)
        endRefreshing()
        if _isRefreshing { beginRefreshing() }
        addTarget()
    }

    func generateRefreshEvent() {
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}

public extension UIScrollView {

    private var _refreshControl: RefreshControl? { return refreshControl as? RefreshControl }

    func addRefreshControll(actionTarget: AnyObject?, action: Selector, replaceIfExist: Bool = false) {
        if !replaceIfExist && refreshControl != nil { return }
        refreshControl = RefreshControl(actionTarget: actionTarget, actionSelector: action)
    }

    func scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: Bool = false) {
        _refreshControl?.refreshActivityIndicatorView()
        guard   let refreshControl = refreshControl,
                contentOffset.y != -refreshControl.frame.height else { return }
        setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: changeContentOffsetWithAnimation)
    }

    private var canStartRefreshing: Bool {
        guard let refreshControl = refreshControl, !refreshControl.isRefreshing else { return false }
        return true
    }

    func startRefreshing() {
        guard canStartRefreshing else { return }
        _refreshControl?.generateRefreshEvent()
    }

    func pullAndRefresh() {
        guard canStartRefreshing else { return }
        scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: true)
        _refreshControl?.generateRefreshEvent()
    }

    func endRefreshing(deadline: DispatchTime? = nil) { _refreshControl?.endRefreshing(deadline: deadline) }
}

использование

// Add refresh control to UICollectionView / UITableView / UIScrollView
private func setupTableView() {
    let tableView = UITableView()
    // ...
    tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
}

@objc func refreshData(_ refreshControl: UIRefreshControl) {
    tableView?.endRefreshing(deadline: .now() + .seconds(3))
}

// Stop refreshing in UICollectionView / UITableView / UIScrollView
tableView.endRefreshing()

// Simulate pull to refresh in UICollectionView / UITableView / UIScrollView
tableView.pullAndRefresh()

Полный образец

Не забудьте добавить код решения здесь

import UIKit

class ViewController: UIViewController {

    private weak var tableView: UITableView?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        let tableView = UITableView()
        view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.dataSource = self
        tableView.delegate = self
        tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
        self.tableView = tableView
    }
}

extension ViewController {
    @objc func refreshData(_ refreshControl: UIRefreshControl) {
        print("refreshing")
        tableView?.endRefreshing(deadline: .now() + .seconds(3))
    }
}

extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(indexPath)"
        return cell
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.pullAndRefresh()
    }
}
Василий Боднарчук
источник
2

Swift 5

private var pullControl = UIRefreshControl()

pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        pullControl.addTarget(self, action: #selector(refreshListData(_:)), for: .valueChanged)
        if #available(iOS 10.0, *) {
            tableView.refreshControl = pullControl
        } else {
            tableView.addSubview(pullControl)
        }
// Actions
@objc private func refreshListData(_ sender: Any) {
        self.pullControl.endRefreshing() // You can stop after API Call
        // Call API
    }
Гурджиндер Сингх
источник
1

Я предлагаю сделать расширение pull To Refresh для использования в каждом классе.

1) Создайте пустой файл Swift: Файл - Новый - Файл - Файл Swift.

2) Добавить следующее

    //  AppExtensions.swift

    import Foundation
    import UIKit    

    var tableRefreshControl:UIRefreshControl = UIRefreshControl()    

    //MARK:- VIEWCONTROLLER EXTENSION METHODS
    public extension UIViewController
    {
        func makePullToRefreshToTableView(tableName: UITableView,triggerToMethodName: String){

            tableRefreshControl.attributedTitle = NSAttributedString(string: "TEST: Pull to refresh")
            tableRefreshControl.backgroundColor = UIColor.whiteColor()
            tableRefreshControl.addTarget(self, action: Selector(triggerToMethodName), forControlEvents: UIControlEvents.ValueChanged)
            tableName.addSubview(tableRefreshControl)
        }
        func makePullToRefreshEndRefreshing (tableName: String)
        {
            tableRefreshControl.endRefreshing()
//additional codes

        }
    }    

3) В вашем View Controller вызовите эти методы как:

  override func viewWillAppear(animated: Bool) {

self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable")
}

4) В какой-то момент вы хотели закончить обновление:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")
AG
источник
1
Ваш код с названием проекта и уведомлением об авторских правах, может не подойти вам :). Какой бы код вы ни разместили здесь, он должен быть бесплатным для всех
Анил Варгезе
Спасибо Анил! Я забыл удалить их.
AG
1

Для тяги, чтобы обновить, я использую

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Монтаж

под 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

и поместите эту функцию в ваш файл swift и вызовите эту функцию из вашего

переопределить функцию viewWillAppear (_ animated: Bool)

     func Refresher() {
      let loadingView = DGElasticPullToRefreshLoadingViewCircle()
      loadingView.tintColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
      self.table.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in

          //Completion block you can perfrom your code here.

           print("Stack Overflow")

           self?.table.dg_stopLoading()
           }, loadingView: loadingView)
      self.table.dg_setPullToRefreshFillColor(UIColor(red: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1))
      self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!)
 }

И не забудьте удалить ссылку, пока вид исчезнет

чтобы удалить тягу, чтобы обновить, вставьте этот код в ваш

переопределить функцию viewDidDisappear (_ animated: Bool)

override func viewDidDisappear(_ animated: Bool) {
      table.dg_removePullToRefresh()

 }

И это будет выглядеть

введите описание изображения здесь

Удачного кодирования :)

Ажархусейн Шейх
источник
1

Вы можете достичь этого, используя несколько строк кода. Так почему вы собираетесь застрять в сторонней библиотеке или пользовательском интерфейсе. Pull для обновления встроен в iOS. Вы можете сделать это быстро, как

введите описание изображения здесь

var pullControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   pullControl.addTarget(self, action: #selector(pulledRefreshControl(_:)), for: UIControl.Event.valueChanged)
   tableView.addSubview(pullControl) // not required when using UITableViewController
}

@objc func pulledRefreshControl(sender:AnyObject) {
   // Code to refresh table view  
}
Мистер Джавед Мултани
источник
0

Вы можете использовать этот подкласс tableView:

import UIKit

protocol PullToRefreshTableViewDelegate : class {
    func tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
}

class PullToRefreshTableView: UITableView {

    @IBOutlet weak var pullToRefreshDelegate: AnyObject?
    private var refreshControl: UIRefreshControl!
    private var isFirstLoad = true

    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)

        if (isFirstLoad) {
            addRefreshControl()
            isFirstLoad = false
        }
    }

    private func addRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
        self.addSubview(refreshControl)
    }

    @objc private func refresh() {
       (pullToRefreshDelegate as? PullToRefreshTableViewDelegate)?.tableViewDidStartRefreshing(self)
    }

    func endRefreshing() {
        refreshControl.endRefreshing()
    }

}

1 - в конструкторе интерфейса измените класс вашего tableView PullToRefreshTableViewили создайте PullToRefreshTableViewпрограммно

2 - реализовать на PullToRefreshTableViewDelegateваш взгляд контроллер

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView)будет вызван в вашем контроллере представления, когда представление таблицы начнет обновляться

4 - позвонить, yourTableView.endRefreshing()чтобы закончить обновление

Chuy47
источник
0

Вот как я заставил это работать, используя Xcode 7.2, который я считаю серьезной ошибкой. Я использую это UITableViewControllerвнутри моегоviewWillAppear

refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged)
refreshControl!.beginRefreshing()

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Как видите, я буквально должен вызывать configureMessage()метод после настройки своего UIRefreshControlthen после этого, последующие обновления будут работать нормально.

jaytrixz
источник
-1

Другие ответы верны, но для более подробной информации проверьте это сообщение Потяните, чтобы обновить

Включить обновление в раскадровке

Когда вы работаете с UITableViewController, решение довольно простое: во-первых, выберите контроллер табличного представления в раскадровке, откройте инспектор атрибутов и включите обновление:

UITableViewController поставляется со ссылкой на UIRefreshControl из коробки. Вам просто нужно подключить несколько вещей, чтобы начать и завершить обновление, когда пользователь отключается.

Переопределить viewDidLoad ()

В переопределении viewDidLoad () добавьте цель для обработки обновления следующим образом:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
        
    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
}
  1. Поскольку я указал «handleRefresh:» (обратите внимание на двоеточие!) В качестве аргумента действия, мне нужно определить функцию в этом классе UITableViewController с тем же именем. Кроме того, функция должна принимать один аргумент
  2. Мы бы хотели, чтобы это действие вызывалось для UIControlEvent с именем ValueChanged.
  3. Не забудьте позвонить refreshControl.endRefreshing()

Для получения дополнительной информации, пожалуйста, перейдите по ссылке Ссылка и все кредиты идут на этот пост

Singhak
источник
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
Тунаки