Swift'te yenilemek için çekme nasıl kullanılır?


248

Ben hızlı kullanarak bir RSS okuyucu inşa ediyorum ve yeniden işlevsellik için çekme uygulamak gerekir.

İşte nasıl yapmaya çalışıyorum.

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

Alıyorum :

Super.init çağrısında 'self.refresh' özelliği başlatılmadı

Lütfen Hareket tanıyanların davranışlarını anlamama yardımcı olun. Çalışan bir örnek kod çok yardımcı olacaktır.

Teşekkürler.



Evet, sadece bu işlevselliğe ihtiyacım var ama ObjC hakkında hiçbir fikrim yok. Hızlı bir şekilde uygulamak istiyorum.
xrage

Yanıtlar:


591

Yenilemek için çek , iOS'ta yerleşiktir. Bunu hızlı bir şekilde yapabilirsin

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  
}

Bir noktada yenilemeyi sonlandırabilirsiniz.

refreshControl.endRefreshing()

15
Teşekkürler! Bunu kullandım. Tembel yükleme için sadece biraz tweaking. Yaparım: "lazy var refreshControl = UIRefreshControl ()" Ben dil güvenliğini yener gibi hissediyor gibi değişkenlerin zorla açılmasını önlemek için iyi bir uygulama buluyorum.
nmdias

10
Hızlı bir not, refreshControl'ü tablo görünümüne bile eklemenize gerek yoktur. Bu dolaylı olarak ele alınır.
Kendrick Ledet

1
@KendrickLedet bir UITableViewController kullanmasanız bile?
Van Du Tran

3
Bu çözümü tablo görünümünün üstünde ve altında nasıl kullanabilirim?
AustinT

3
Swift 4 Güncellemesi: refreshControl.addTarget (kendi kendine, eylem: "refresh:", için: .valueChanged)
akseli

148

Film şeridi ve hızlı bir çözüm ...

1.) .storyboard dosyanızı açın, film şeridinizden bir TableViewController seçin ve Yardımcı Programlar'daki Tablo Görünümü Denetleyici - Yenileme özelliğini "Etkinleştirin".

resim açıklamasını buraya girin

2.) İlişkili UITableViewController-Class'ı açın ve viewDidLoad-Method'a aşağıdaki satırı ekleyin.

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

Swift 5.0 için düzenlendi:

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

VEYA Swift 2.2'de:

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

3.) viewDidLoad-Method'un üstüne aşağıdaki Yöntemi ekleyin

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

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}

7
Ayrıca, storyboard'daki Refresh Control'den ViewController'ınıza kontrol sürükleyerek storyboard ile yenileme eylemi ekleyebilirsiniz
uiureo

Yükleme verilerim zaman uyumsuzsa, ben put self.tableView.reloadData()ve self.refreshControl?.endRefreshing()geri aramada mı?
Qian Chen

Kesinlikle! Ve reloadData()kullanıcı arayüzünüzü anında yenilemek için ana kuyruğa koyun : dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Boş

1
Bu şekilde kabul edilen cevap yerine tercih edilen hataya göre tercih edildi (en azından benim için hızlı 2+ kullanıyorum)
Ryan Walton

1
Bu cevap en fazla oyu almalı ve doğru cevap olmalıdır
krummens

75

İOS 10'dan beri dahil edilen bir PRETTY COOL özelliğinden bahsetmek istiyorum :

Şimdilik, UIRefreshControl doğrudan her birinde desteklenir UICollectionView, UITableViewve UIScrollView!

Bu görünümlerin her birinin refreshControl örnek özelliği vardır; bu , artık kaydırma görünümünüzde alt görünüm olarak eklemeye gerek olmadığı anlamına gelir; tek yapmanız gereken:

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

Şahsen, kaydırma görünümü için bir özellik olarak alt görünüm olarak eklemekten çok daha doğal buluyorum, özellikle de bir UIRefreshControl için bir denetim olarak görünecek tek uygun görünüm bir kaydırma görünümü, yani UIRefreshControl kullanmanın işlevselliği sadece kaydırma görünümü ile çalışırken kullanışlıdır; Bu nedenle yenileme kontrol görünümünü ayarlamak için bu yaklaşım daha açık olmalıdır.

Ancak, hala addSubviewiOS sürümüne göre kullanma seçeneğiniz vardır :

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}

hey dostum, doSomething fonunda ne ararım? Ben yeniden yüklemek.Data tekrar yüklemek istemiyor!

@JavierV. doSomethingişlevde bir kesme noktası ekleyin , erişilebilirse kodunuzu kontrol etmeniz gerekir.
Ahmad F

50

Hızlı 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
}

Ayrıca aşağıdakilerle yenilemeyi durdurabilirsiniz:

refreshControl.endRefreshing()

Örneğinde bahsetmeyi unutma tableView.reloadData()!
Konstantinos Natsios

Merhaba ben bu arada benim refreshcontrol oluşturun: 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 }. Sonra endRefreshing () çağırın, işe yaramaz (refreshcontrol hala orada gösterir), ancak yolunuzu izleyin, işe yaradı, lütfen bana nedenini bildirin?
lee

@lee Çünkü rfControl yereldir ve dışarıdan erişimi yoktur. RfControl'ü VC'ye genel bir değişken olarak başlatmayı deneyin: var rfControl = UIRefreshControl () ve rfControl.endRefreshing ()
Gilad Brunfman

Bir soru: .valueChangedetkinliğin nerede tetiklendiği? Bu bağlantıyı anlamıyorum.
juniorgarcia

UIRefreshControl tetiklendiğinde, eklediğinizde gördüğünüz gibiTarget: refreshControl.addTarget (self, eylem: #selector (self.refresh), için:
UIControlEvents.valueChanged

9

In Swift bunu kullanın,

WebView'da yenilemek için çekme yapmak istiyorsanız,

Bu yüzden bu kodu deneyin:

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

Teşekkürler bayım! Öğrenirken yaşadığım bir noob problemini çözdüm.
Adrian David Smith

5

Anhil'in yanıtı bana çok yardımcı oldu.

Ancak, daha sonra denedikten sonra önerilen çözüm bazen çok hoş olmayan bir UI aksaklığına neden olduğunu fark ettim .

Bunun yerine, bu yaklaşıma * gitmek benim için hile yaptı.

* Hızlı 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

2

Hatanın size söylediği şey, refreshbaşlatılmamış olmasıdır. refreshİsteğe bağlı yapmamayı seçtiğinizi unutmayın , bu Swift'te aramadan önce bir değere sahip olması gerektiği anlamına gelir super.init(veya örtük olarak çağrılır, bu da sizin durumunuz gibi görünüyor). Ya hale refreshopsiyonel (istediğiniz muhtemelen neyi) ya da bir şekilde başlatmak.

Swift tanıtım belgesini tekrar okumanızı öneririm.

@Anil tarafından işaret edildiği gibi, cevabın bir parçası olmayan son bir şey, iOS'ta denilen UIRefresControl, kontrol etmeye değer bir şey olabilecek yerleşik bir kontrol çekme işlemi var .


2

Başlangıçta yukarıda listelenen bazı sorunların yaşandığı Yenilemek için Çek özelliğini kullandığım bir RSS yayın uygulaması oluşturdum .

Ancak kullanıcılara yukarıdaki cevapları eklemek için her yerde kullanım durumumu arıyordum ve bulamadım. Web'den (RSSFeed) veri indiriyordum ve masamı aşağı çekmek istedim.

Yukarıda bahsedilenler doğru alanları kapsar, ancak insanların yaşadığı bazı problemlerle, işte yaptığım şey ve bir tedavi işe yarar:

@Blankarsch'ın yaklaşımını aldım ve ana tabloma gittim ve yenilemeyi kullanmak için tablo görünümünü seçtim, sonra bahsedilmeyen şey, yenilemeyi verimli bir şekilde kullanmak için IBOutlet ve IBAction'ı oluşturmaktır

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

Umarım bu benimle aynı durumda olan herkese yardımcı olur


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

2

ayrıntılar

  • Xcode Sürüm 10.3 (10G8), Swift 5

Özellikleri

  • Programlı olarak "yenilemek için çekme" yapabilme
  • Çoklu "çekme-yenileme" olaylarından koruma
  • Görünüm denetleyicisi değiştiğinde etkinlik göstergesini canlandırmaya devam etme yeteneği (örn. TabController olması durumunda)

Çözüm

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

kullanım

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

Tam Örnek

Çözüm kodunu buraya eklemeyi unutmayın

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

Hızlı 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

Her sınıfta kullanmak için bir Pull To Refresh eklentisi yapmanızı öneririm.

1) Boş bir swift dosyası oluşturun: Dosya - Yeni - Dosya - Swift Dosya.

2) Aşağıdakileri Ekleyin

    //  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) Görünüm Kontrolcünüzde şu yöntemleri çağırın:

  override func viewWillAppear(animated: Bool) {

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

4) Bir noktada yenilemeyi sonlandırmak istediniz:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")

1
Kodunuz proje adı ve telif hakkı bildirimi ile sizin için iyi olmayabilir :). Burada yayınladığınız kod ne olursa olsun herkesin kullanması ücretsiz olmalıdır
Anil Varghese

Teşekkürler Anil! Bunları kaldırmayı unuttum.
AG

1

Çekmenin yenilenmesi için kullanıyorum

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Kurulum

'DGElasticPullToRefresh' bölmesi

import DGElasticPullToRefresh

ve bu işlevi hızlı dosyanıza koyun ve bu işlevi

işlev görünümünü geçersiz kılWillAppear (_ 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!)
 }

Ve görünüm kaybolurken referansı kaldırmayı unutma

yenilemek için çekmeyi kaldırmak için bu kodu

işlev görünümünü geçersiz kılDidDisappear (_ animated: Bool)

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

 }

Ve öyle görünecek

resim açıklamasını buraya girin

Mutlu kodlama :)


1

Bunu birkaç kod satırı kullanarak gerçekleştirebilirsiniz. Öyleyse neden üçüncü taraf kütüphanesine veya kullanıcı arayüzüne yapışacaksınız. Yenilemek için çek, iOS'ta yerleşiktir. Bunu hızlı bir şekilde yapabilirsin

resim açıklamasını buraya girin

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'in bu alt sınıfını kullanabilirsiniz:

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 - değişiklik oluşturucu arayüzündeki tableView sınıfı için PullToRefreshTableViewveya oluşturmakPullToRefreshTableView programlı

2 - Uygulamayı PullToRefreshTableViewDelegate görünüm denetleyicinize uygulayın

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView) tablo görünümü yenilenmeye başladığında görünüm denetleyicinizde çağrılır

4 - Yenilemeyi yourTableView.endRefreshing()bitirmek için çağrı


0

Ben böyle büyük bir hata olduğunu düşünüyorum Xcode 7.2 kullanarak çalışması yaptı. Benim içimde kullanıyorum UITableViewControlleriç benimviewWillAppear

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

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Gördüğünüz gibi, tam anlamıyla configureMessage()benim kurduktan sonra yöntemi çağırmak zorundayım, UIRefreshControldaha sonra, sonraki yenilemeler iyi çalışacaktır.


-1

Diğer Yanıtlar Doğru Ama Daha Fazla Ayrıntı İçin Bu Gönderiyi Kontrol Edin Yenilemek için Çekin

Storyboard'da yenilemeyi etkinleştir

Bir UITableViewController ile çalışırken, çözüm oldukça basittir: İlk olarak, film şeridinizde tablo görünümü denetleyicisini seçin, nitelik denetçisini açın ve yenilemeyi etkinleştirin:

Bir UITableViewController kutudan çıkan bir UIRefreshControl referansı ile donatılmıştır. Kullanıcı aşağı çekildiğinde yenilemeyi başlatmak ve tamamlamak için birkaç şey bağlamanız yeterlidir.

ViewDidLoad () işlevini geçersiz kıl

ViewDidLoad () geçersiz kılmanızda, yenilemeyi aşağıdaki gibi işlemek için bir hedef ekleyin:

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. Eylem bağımsız değişkeni olarak "handleRefresh:" (iki nokta üst üste!) Belirtmiş olduğum için, aynı ada sahip bu UITableViewController sınıfında bir işlev tanımlamak gerekir. Ayrıca, işlev bir bağımsız değişken almalıdır
  2. Bu eylemin ValueChanged adlı UIControlEvent için çağrılmasını istiyoruz
  3. Aramayı unutma refreshControl.endRefreshing()

Daha fazla bilgi için, lütfen Link'e geçin ve tüm kredi bu gönderiye gider


Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
Tunaki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.