Jak używać pull do odświeżania w Swift?

248

Buduję czytnik RSS za pomocą programu fast i muszę zaimplementować funkcję pull, aby ponownie załadować.

Oto jak próbuję to zrobić.

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

Staje się :

Właściwość „self.refresh” nie została zainicjowana przy wywołaniu super.init

Pomóż mi zrozumieć zachowanie osób rozpoznających gesty. Świetnie pomoże działający przykładowy kod.

Dzięki.

xrage
źródło
Chcesz odświeżyć w widoku tabeli coś takiego jak techrepublic.com/blog/software-engineer/…
Anil Varghese
Tak, potrzebuję tylko tej funkcjonalności, ale nie mam pojęcia o ObjC. Chcesz szybko wdrożyć.
xrage

Odpowiedzi:

591

Pull to refresh jest wbudowany w iOS. Możesz to zrobić w szybki sposób

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  
}

W pewnym momencie możesz zakończyć odświeżanie.

refreshControl.endRefreshing()
Anil Varghese
źródło
15
Dzięki! Użyłem tego. Tylko drobna poprawka, dla leniwego ładowania. Zrobiłbym: „lazy var refreshControl = UIRefreshControl ()” Uważam, że dobrą praktyką jest unikanie wymuszonego rozpakowywania zmiennych, ponieważ wydaje się, że podważa to bezpieczeństwo języka.
nmdias
10
Krótka uwaga, nie musisz nawet dodawać odświeżania do widoku tabeli. Zajmuje się to niejawnie.
Kendrick Ledet
1
@KendrickLedet, nawet jeśli nie używasz UITableViewController?
Van Du Tran,
3
Jak mogę użyć tego rozwiązania na górze widoku tabeli i na dole?
AustinT
3
Aktualizacja Swift 4: refreshControl.addTarget (self, akcja: „refresh:”, for: .valueChanged)
akseli
148

Rozwiązanie z storyboardem i szybkim ...

1.) Otwórz plik .storyboard, wybierz TableViewController w swojej serii ujęć i „Włącz” Kontrolę widoku tabeli - Odświeżanie w Narzędziach.

wprowadź opis zdjęcia tutaj

2.) Otwórz powiązaną klasę UITableViewController i dodaj następujący wiersz do metody viewDidLoad.

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

Edytowane dla Swift 5.0:

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

LUB w Swift 2.2:

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

3.) Dodaj następującą metodę nad metodą viewDidLoad

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

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}
Pusty
źródło
7
możesz także dodać akcję odświeżania w serii ujęć, przeciągając klawisz Control z przeciągania z Odśwież kontrolę w serii ujęć do swojego kontrolera ViewController
uiureo
Jeśli moje ładowanie danych jest asynchroniczne, czy powinienem put self.tableView.reloadData()i self.refreshControl?.endRefreshing()oddzwonić?
Qian Chen,
Dokładnie! I umieść reloadData()w głównej kolejce, aby natychmiast odświeżyć interfejs użytkownika: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Pusty
1
Ten sposób był lepszy niż zaakceptowana odpowiedź z tego powodu, że nie było wtedy błędów układu (przynajmniej dla mnie przy użyciu swift 2+)
Ryan Walton
1
Ta odpowiedź powinna mieć największą liczbę głosów i być poprawną odpowiedzią
krummens
75

Chciałbym wspomnieć o funkcji PRETTY COOL , która jest dostępna od iOS 10, a mianowicie:

Na razie UIRefreshControl jest bezpośrednio obsługiwany w każdym UICollectionView, UITableViewi UIScrollView!

Każdy z tych widoków ma właściwość instancji refreshControl , co oznacza, że nie ma już potrzeby dodawania go jako widoku podrzędnego w widoku przewijania , wystarczy:

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

Osobiście uważam, że bardziej naturalne jest traktowanie go jako właściwości widoku przewijania niż dodawanie go jako widoku podrzędnego, szczególnie dlatego, że jedynym odpowiednim widokiem, który może być nadzorem dla UIRefreshControl, jest widok przewijania, tzn. Funkcjonalność używania UIRefreshControl jest tylko przydatne podczas pracy z widokiem przewijania; Dlatego takie podejście powinno być bardziej oczywiste przy konfigurowaniu widoku sterowania odświeżaniem.

Nadal masz jednak możliwość korzystania z wersji addSubviewopartej na systemie iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}
Ahmad F.
źródło
hej człowieku, jak mam nazywać doCoś takiego? jeśli wywołam reload.Data nie chce się ładować ponownie!
@JavierV. dodaj punkt przerwania w doSomethingfunkcji, jeśli jest osiągalny, musisz sprawdzić kod.
Ahmad F
50

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

I możesz przestać odświeżać za pomocą:

refreshControl.endRefreshing()
Gilad Brunfman
źródło
Nie zapomnij wspomnieć tableView.reloadData()w swoim przykładzie!
Konstantinos Natsios,
Cześć tworzę refreshcontrol przez ten sposób: 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 }. Następnie wywołaj endRefreshing (), to nie działa (odświeżanie nadal tam pokazuje), ale podążaj swoją drogą, działało, daj mi znać dlaczego?
Lee
@lee Ponieważ rfControl jest lokalny i nie ma dostępu z zewnątrz. Spróbuj zainicjować rfControl jako zmienną globalną dla VC: var rfControl = UIRefreshControl () i zatrzymaj się za pomocą rfControl.endRefreshing ()
Gilad Brunfman
Pytanie: gdzie następuje .valueChangedzdarzenie? Nie rozumiem tego połączenia.
juniorgarcia
po uruchomieniu UIRefreshControl, jak widać po dodaniuTarget: refreshControl.addTarget (self, action: #selector (self.refresh), dla: UIControlEvents.valueChanged)
Gilad Brunfman
9

W Swift użyj tego,

Jeśli chcesz pobrać w celu odświeżenia w WebView,

Więc wypróbuj ten kod:

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
źródło
Dziękuję Panu! Rozwiązałem problem nooba, który miałem podczas nauki.
Adrian David Smith
5

Odpowiedź Anhila bardzo mi pomogła.

Jednak po dalszych eksperymentach zauważyłem, że sugerowane rozwiązanie czasami powoduje niezbyt ładną usterkę interfejsu użytkownika .

Zamiast tego skorzystanie z tego podejścia * załatwiło sprawę.

* 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
źródło
2

Błąd mówi ci, że refreshnie został zainicjowany. Zauważ, że wybrałeś opcję refreshnieobowiązkową, co w Swift oznacza, że musi ona mieć wartość przed wywołaniem super.init(lub jest domyślnie wywołana, co wydaje się być twoim przypadkiem). Wybierz refreshopcjonalne (prawdopodobnie to, czego chcesz) lub zainicjuj w jakiś sposób.

Sugerowałbym ponowne przeczytanie dokumentacji wprowadzającej Swift, która omawia to bardzo szczegółowo.

Ostatnia rzecz, nie będąca częścią odpowiedzi, jak wskazał @Anil, ma wbudowaną funkcję ściągania w celu odświeżenia kontroli w iOS o nazwie UIRefresControl, która może być czymś, na co warto zwrócić uwagę.

JustSid
źródło
2

Zbudowałem aplikację kanału RSS, w której mam funkcję odświeżania Pull To, która pierwotnie miała niektóre z wyżej wymienionych problemów.

Ale aby dodać do powyższych odpowiedzi użytkowników, szukałem wszędzie mojego przypadku użycia i nie mogłem go znaleźć. Ściągałem dane z Internetu (RSSFeed) i chciałem ściągnąć na stół Widok historii do odświeżenia.

To, co wspomniano powyżej, obejmuje właściwe obszary, ale z niektórymi problemami, jakie mają ludzie, oto co zrobiłem i działa to na ucztę:

Przyjąłem podejście @Blankarsch i poszedłem do mojej main.storyboard i wybrałem widok tabeli, aby użyć odświeżenia, a następnie nie wspomniano o utworzeniu IBOutlet i IBAction, aby efektywnie korzystać z odświeżania

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

Mam nadzieję, że to pomoże każdemu w takiej samej sytuacji jak ja

Dom Bryan
źródło
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()
}
zatrudniony
źródło
2

Detale

  • Wersja Xcode 10.3 (10G8), Swift 5

cechy

  • Możliwość zaprogramowania „przeciągnij, aby odświeżyć”
  • Ochrona przed wieloma zdarzeniami typu „pull to refresh”
  • Możliwość kontynuowania animacji wskaźnika aktywności po przełączeniu kontrolera widoku (np. W przypadku TabController)

Rozwiązanie

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

Stosowanie

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

Pełna próbka

Nie zapomnij dodać tutaj kodu rozwiązania

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()
    }
}
Wasilij Bodnarchuk
źródło
2

Szybki 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
źródło
1

Proponuję zrobić rozszerzenie pull To Refresh do użycia w każdej klasie.

1) Utwórz pusty plik szybki: Plik - Nowy - Plik - Szybki plik.

2) Dodaj następujące

    //  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) W widoku kontrolera wywołaj te metody jako:

  override func viewWillAppear(animated: Bool) {

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

4) W pewnym momencie chciałeś zakończyć odświeżanie:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")
AG
źródło
1
Twój kod zawiera nazwę projektu i informację o prawach autorskich, może nie być dla ciebie dobry :). Każdy kod, który tu umieściłeś, powinien być darmowy dla każdego
Anil Varghese
Dzięki Anil! Zapomniałem ich usunąć.
AG
1

Do ściągnięcia w celu odświeżenia używam

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Instalacja

pod „DGElasticPullToRefresh”

import DGElasticPullToRefresh

i umieść tę funkcję w swoim szybkim pliku i wywołaj tę funkcję z twojego

przesłonić widok funcWillAppear (_ animowane: 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!)
 }

I nie zapomnij usunąć odniesienia, gdy widok zniknie

aby usunąć pull, aby odświeżyć, wstaw ten kod do swojego

przesłonić func viewDidDisappear (_ animated: Bool)

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

 }

I to będzie wyglądać

wprowadź opis zdjęcia tutaj

Miłego kodowania :)

Azharhussain Shaikh
źródło
1

Możesz to osiągnąć za pomocą kilku wierszy kodu. Dlaczego więc utkniesz w bibliotece lub interfejsie użytkownika innej firmy? Pull to refresh jest wbudowany w iOS. Możesz to zrobić w szybki sposób

wprowadź opis zdjęcia tutaj

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
źródło
0

możesz użyć tej podklasy 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 - w narzędziu do tworzenia interfejsów zmień klasę tabeli Wyświetl PullToRefreshTableViewlub utwórz plikPullToRefreshTableView programowo

2 - zaimplementuj PullToRefreshTableViewDelegate kontroler widoku

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView) zostanie wywołany w kontrolerze widoku, gdy widok tabeli zacznie się odświeżać

4 - połączenie, yourTableView.endRefreshing()aby zakończyć odświeżanie

Chuy47
źródło
0

W ten sposób sprawiłem, że działał za pomocą Xcode 7.2, co moim zdaniem jest poważnym błędem. Używam tego w moim UITableViewControllerwnętrzuviewWillAppear

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

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Jak widać, dosłownie muszę wywołać tę configureMessage()metodę po skonfigurowaniu mojego, UIRefreshControla następnie kolejne odświeżenia będą działać dobrze.

jaytrixz
źródło
-1

Inne odpowiedzi są poprawne, ale aby uzyskać więcej szczegółów, sprawdź ten post Pull to Refresh

Włącz odświeżanie w Storyboard

Podczas pracy z UITableViewController rozwiązanie jest dość proste: Najpierw wybierz kontroler widoku tabeli w swojej serii ujęć, otwórz inspektor atrybutów i włącz odświeżanie:

UITableViewController jest wyposażony w odniesienie do UIRefreshControl po wyjęciu z pudełka. Musisz tylko połączyć kilka rzeczy, aby zainicjować i zakończyć odświeżanie, gdy użytkownik pociągnie w dół.

Zastąp viewDidLoad ()

W zastąpieniu metody viewDidLoad () dodaj cel do obsługi odświeżania w następujący sposób:

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. Ponieważ jako argument akcji podałem „handleRefresh:” (zwróć uwagę na dwukropek!), Muszę zdefiniować funkcję w tej klasie UITableViewController o tej samej nazwie. Dodatkowo funkcja powinna przyjąć jeden argument
  2. Chcielibyśmy, aby ta akcja była wywoływana dla zdarzenia UIControlEvent o nazwie ValueChanged
  3. Nie zapomnij zadzwonić refreshControl.endRefreshing()

Aby uzyskać więcej informacji, proszę wspomnieć o linku, a cały kredyt trafia na ten post

Singhak
źródło
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Tunaki