Bagaimana cara menggunakan tarikan untuk menyegarkan di Swift?

248

Saya sedang membangun pembaca RSS menggunakan cepat dan perlu menerapkan tarikan untuk memuat kembali fungsionalitas.

Inilah cara saya mencoba melakukannya.

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()
}

Saya mendapatkan:

Properti 'self.refresh' tidak diinisialisasi pada panggilan super.init

Tolong bantu saya untuk memahami perilaku recognisers gerakan. Kode contoh yang berfungsi akan sangat membantu.

Terima kasih.

xrage
sumber
Anda ingin menarik untuk menyegarkan dalam tampilan tabel
Anil Varghese
Ya, saya memerlukan fungsi ini saja tetapi saya tidak memiliki petunjuk ObjC. Ingin diimplementasikan dengan cepat.
xrage

Jawaban:

591

Tarik untuk menyegarkan dibangun di iOS. Anda bisa melakukan ini dengan cepat

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  
}

Pada titik tertentu Anda bisa mengakhiri penyegaran.

refreshControl.endRefreshing()
Anil Varghese
sumber
15
Terima kasih! Saya menggunakan ini. Hanya beberapa penyesuaian, untuk memuat malas. Saya akan melakukan: "lazy var refreshControl = UIRefreshControl ()" Saya menemukan praktik yang baik untuk menghindari pembongkaran variabel secara paksa, karena rasanya seperti mengalahkan keamanan bahasa.
nmdias
10
Hanya catatan singkat, Anda bahkan tidak perlu menambahkan refreshControl ke tampilan tabel. Itu ditangani secara implisit.
Kendrick Ledet
1
@KendrickLedet bahkan jika Anda tidak menggunakan UITableViewController?
Van Du Tran
3
Bagaimana saya bisa menggunakan solusi ini untuk bagian atas tampilan tabel dan di bagian bawah?
AustinT
3
Pembaruan Swift 4: refreshControl.addTarget (self, action: "refresh:", untuk: .valueChanged)
akseli
148

Solusi dengan storyboard dan cepat ...

1.) Buka file .storyboard Anda, pilih TableViewController di storyboard Anda dan "Aktifkan" Table View Controller - Refreshing fitur di Utilities.

masukkan deskripsi gambar di sini

2.) Buka Kelas UITableViewController terkait dan tambahkan baris berikut ke dalam viewDidLoad-Method.

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

Diedit untuk Swift 5.0:

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

ATAU dalam Swift 2.2:

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

3.) Tambahkan Metode berikut di atas viewDidLoad-Method

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

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}
Kosong
sumber
7
juga, Anda dapat menambahkan aksi penyegaran dengan storyboard dengan menyeret kontrol dari Refresh Control di storyboard ke ViewController Anda
uiureo
Jika memuat data saya tidak sinkron, haruskah saya put self.tableView.reloadData()dan self.refreshControl?.endRefreshing()dalam panggilan balik?
Qian Chen
Persis! Dan masukkan reloadData()ke dalam antrian utama untuk menyegarkan UI Anda secara instan: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Kosong
1
Cara ini lebih disukai daripada jawaban yang diterima karena tidak ada bug tata letak (setidaknya bagi saya yang menggunakan swift 2+)
Ryan Walton
1
Jawaban ini harus memiliki suara terbanyak dan menjadi jawaban yang benar
krummens
75

Saya ingin menyebutkan fitur CUKUP COOL yang telah disertakan sejak iOS 10, yaitu:

Untuk saat ini, UIRefreshControl didukung langsung di masing-masing UICollectionView, UITableViewdan UIScrollView!

Masing-masing dari pandangan ini memiliki properti instance refreshControl , yang berarti bahwa tidak perlu lagi menambahkannya sebagai subview dalam tampilan gulir Anda , yang harus Anda lakukan adalah:

@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()
}

Secara pribadi, saya merasa lebih alami untuk memperlakukannya sebagai properti untuk tampilan gulir lebih dari menambahkannya sebagai subview, terutama karena satu-satunya tampilan yang sesuai sebagai superview untuk UIRefreshControl adalah scrollview, yaitu fungsi menggunakan UIRefreshControl hanya berguna saat bekerja dengan tampilan gulir; Itu sebabnya pendekatan ini harus lebih jelas untuk mengatur tampilan kontrol penyegaran.

Namun, Anda masih memiliki opsi untuk menggunakan addSubviewberbasis pada versi iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}
Ahmad F
sumber
hai teman, apa yang saya sebut di doSomething func? jika saya memanggil reload. Data itu tidak mau memuat lagi!
@JavierV. tambahkan doSomethingfungsi breakpoint , jika bisa dijangkau maka Anda harus memeriksa kode Anda.
Ahmad F
50

Cepat 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
}

Dan Anda bisa berhenti menyegarkan dengan:

refreshControl.endRefreshing()
Gilad Brunfman
sumber
Jangan lupa sebutkan tableView.reloadData()dalam contoh Anda!
Konstantinos Natsios
Hi saya membuat refreshcontrol saya dengan cara itu: 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 }. Kemudian panggil endRefreshing (), itu tidak berfungsi (refreshcontrol masih menunjukkan di sana), tetapi ikuti jalan Anda, itu berhasil, tolong beri tahu saya mengapa?
lee
@lee Karena rfControl adalah lokal dan tidak memiliki akses dari luar. Cobalah untuk menginisialisasi rfControl sebagai variabel global ke VC: var rfControl = UIRefreshControl (), dan berhenti dengan rfControl.endRefreshing ()
Gilad Brunfman
Sebuah pertanyaan: di mana .valueChangedacara tersebut dipicu? Saya tidak mengerti hubungan ini.
juniorgarcia
ketika UIRefreshControl dipicu, seperti yang Anda lihat ketika Anda menambahkan Target: refreshControl.addTarget (self, action: #selector (self.refresh), untuk: UIControlEvents.valueChanged)
Gilad Brunfman
9

Dalam Swift gunakan ini,

Jika Anda ingin menarik untuk menyegarkan di WebView,

Jadi coba kode ini:

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()
}
Mohammad Zaid Pathan
sumber
Terima kasih Pak! Memecahkan masalah noob yang saya alami saat belajar.
Adrian David Smith
5

Jawaban Anhil banyak membantu saya.

Namun, setelah bereksperimen lebih lanjut, saya memperhatikan bahwa solusi yang disarankan terkadang menyebabkan kesalahan UI yang tidak terlalu cantik .

Sebaliknya, pergi untuk pendekatan ini * melakukan trik untuk saya.

* Cepat 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
sumber
2

Apa kesalahan memberitahu Anda, adalah yang refreshtidak diinisialisasi. Perhatikan bahwa Anda memilih untuk membuat refreshtidak opsional, yang pada Swift berarti bahwa ia memiliki memiliki nilai sebelum Anda menelepon super.init(atau itu secara implisit disebut, yang tampaknya menjadi kasus Anda). Entah membuatrefresh opsional (mungkin apa yang Anda inginkan) atau inisialisasi dengan beberapa cara.

Saya akan menyarankan membaca dokumentasi pengantar Swift lagi, yang mencakup ini sangat panjang.

Satu hal terakhir, bukan bagian dari jawaban, seperti yang ditunjukkan oleh @Anil, ada tarikan internal untuk menyegarkan kontrol di iOS yang disebut UIRefresControl, yang mungkin merupakan sesuatu yang layak untuk dilihat.

JustSid
sumber
2

Saya membangun aplikasi umpan RSS di mana saya memiliki Tarik untuk menyegarkan yang awalnya memiliki beberapa masalah yang tercantum di atas.

Tetapi untuk menambahkan jawaban pengguna di atas, saya mencari di mana-mana untuk kasus penggunaan saya dan tidak dapat menemukannya. Saya sedang mengunduh data dari web (RSSFeed) dan saya ingin menarik di atas meja saya Lihat cerita untuk menyegarkan.

Apa yang disebutkan di atas mencakup area yang tepat tetapi dengan beberapa masalah yang orang hadapi, inilah yang saya lakukan dan berhasil:

Saya mengambil pendekatan @Blankarsch dan pergi ke main.storyboard saya dan memilih tampilan tabel untuk menggunakan refresh, maka yang tidak disebutkan adalah membuat IBOutlet dan IBAction untuk menggunakan refresh secara efisien

//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()
}

Semoga ini bisa membantu siapa pun dalam situasi yang sama dengan saya

Dom Bryan
sumber
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
sumber
2

Detail

  • Xcode Versi 10.3 (10G8), Swift 5

fitur

  • Kemampuan membuat "pull to refresh" secara terprogram
  • Perlindungan dari berbagai peristiwa "tarik untuk menyegarkan"
  • Kemampuan untuk terus menggerakkan indikator aktivitas ketika pengontrol tampilan diaktifkan (mis. Dalam kasus TabController)

Larutan

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) }
}

Pemakaian

// 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()

Sampel Lengkap

Jangan lupa untuk menambahkan kode solusi di sini

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()
    }
}
Bodnarchuk dengan mudah
sumber
2

Cepat 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
    }
Gurjinder Singh
sumber
1

Saya sarankan untuk membuat Extension of pull To Refresh untuk digunakan di setiap kelas.

1) Buat file cepat kosong: File - Baru - File - File Swift.

2) Tambahkan yang Berikut

    //  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) Di Pengontrol Tampilan Anda panggil metode ini sebagai:

  override func viewWillAppear(animated: Bool) {

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

4) Pada titik tertentu Anda ingin mengakhiri penyegaran:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")
AG
sumber
1
Kode Anda dengan nama proyek dan pemberitahuan hak cipta, mungkin tidak baik untuk Anda :). Kode apa pun yang Anda poskan di sini harus gratis untuk digunakan semua orang
Anil Varghese
Anil terima kasih! Saya memang lupa untuk menghapusnya.
AG
1

Untuk tarikan untuk menyegarkan saya gunakan

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Instalasi

pod 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

dan memasukkan fungsi ini ke file cepat Anda dan memanggil fungsi ini dari Anda

override func 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!)
 }

Dan jangan lupa untuk menghapus referensi sementara tampilan akan hilang

untuk menghapus tarik untuk menyegarkan masukkan kode ini ke Anda

override func viewDidDisappear (_ animated: Bool)

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

 }

Dan akan terlihat seperti

masukkan deskripsi gambar di sini

Selamat coding :)

Azharhussain Shaikh
sumber
1

Anda dapat mencapai ini dengan menggunakan beberapa baris kode. Jadi mengapa Anda akan terjebak di perpustakaan pihak ketiga atau UI. Tarik untuk menyegarkan dibangun di iOS. Anda bisa melakukan ini dengan cepat

masukkan deskripsi gambar di sini

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  
}
Mr.Javed Multani
sumber
0

Anda bisa menggunakan subclass dari tableView ini:

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()
    }

}

Pembuat antarmuka 1 - in mengubah kelas tableView Anda menjadi PullToRefreshTableViewatau membuat PullToRefreshTableViewprogram

2 - mengimplementasikan PullToRefreshTableViewDelegatepengontrol tampilan Anda

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView)akan dipanggil di pengontrol tampilan Anda ketika tampilan tabel mulai menyegarkan

4 - panggilan yourTableView.endRefreshing()untuk menyelesaikan penyegaran

Chuy47
sumber
0

Ini adalah bagaimana saya membuatnya bekerja menggunakan Xcode 7.2 yang menurut saya merupakan bug utama. Saya menggunakannya di dalam UITableViewControllerbagian dalam sayaviewWillAppear

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

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Seperti yang Anda lihat, saya benar-benar harus memanggil configureMessage()metode setelah mengatur saya UIRefreshControlkemudian setelah itu, refresh berikutnya akan berfungsi dengan baik.

jaytrixz
sumber
-1

Jawaban Lain Benar, Tetapi untuk Lebih Detail, periksa Tulisan ini Tarik untuk Menyegarkan

Aktifkan penyegaran di Storyboard

Saat Anda bekerja dengan UITableViewController, solusinya cukup sederhana: Pertama, Pilih pengontrol tampilan tabel di storyboard Anda, buka inspektur atribut, dan aktifkan penyegaran:

UITableViewController dilengkapi dengan referensi ke UIRefreshControl di luar kotak. Anda hanya perlu memasang beberapa hal untuk memulai dan menyelesaikan penyegaran saat pengguna menariknya.

Override viewDidLoad ()

Di override dari viewDidLoad (), tambahkan target untuk menangani refresh sebagai berikut:

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. Karena saya telah menetapkan "handleRefresh:" (perhatikan titik dua!) Sebagai argumen tindakan, saya perlu mendefinisikan fungsi di kelas UITableViewController ini dengan nama yang sama. Selain itu, fungsi harus mengambil satu argumen
  2. Kami ingin tindakan ini dipanggil untuk UIControlEvent yang disebut ValueChanged
  3. Jangan lupa menelepon refreshControl.endRefreshing()

Untuk informasi lebih lanjut Silakan pergi ke menyebutkan Tautan dan semua kredit masuk ke pos itu

Singhak
sumber
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Tunaki