[objective-c] UIRefreshControl senza UITableViewController



5 Answers

Per eliminare la balbuzie causata dalla risposta accettata, è possibile assegnare UITableView a un UITableViewController .

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

MODIFICARE:

Un modo per aggiungere un UIRefreshControl senza UITableViewController senza stutter e mantenere la bella animazione dopo aver aggiornato i dati sul tableview.

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];

Più tardi durante la gestione dei dati aggiornati ...

- (void)handleRefresh:(UIRefreshControl *)refreshControl {
    [self.theTableView reloadData];
    [self.theTableView layoutIfNeeded];
    [refreshControl endRefreshing];
}
Question

Semplicemente curioso, perché non sembra immediatamente possibile, ma c'è un modo subdolo per sfruttare la nuova classe UIRefreshControl iOS 6 senza utilizzare una sottoclasse UITableViewController ?

Io uso spesso un UIViewController con una sottoview UITableView e sono conforme a UITableViewDataSource e UITableViewDelegate piuttosto che usare un UITableViewController titolo definitivo.




Per Swift 2.2.

Per prima cosa rendi UIRefreshControl ().

var refreshControl : UIRefreshControl!

Nel tuo metodo viewDidLoad () aggiungi:

refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Refreshing..")
    refreshControl.addTarget(self, action: #selector(YourUIViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
    self.tableView.addSubview(refreshControl)

E fare la funzione di aggiornamento

func refresh(refreshControl: UIRefreshControl) {

    // do something ...

    // reload tableView
    self.tableView.reloadData()

    // End refreshing
    refreshControl.endRefreshing()
}



Bene UIRefreshControl è una sottoclasse UIView, quindi puoi usarla da sola. Non sono sicuro di come si renda. Il rendering potrebbe semplicemente dipendere dal frame, ma potrebbe anche fare affidamento su un UIScrollView o UITableViewController.

In ogni caso, sarà più un trucco che una soluzione elegante. Ti consiglio di guardare uno dei cloni di terze parti disponibili o di scriverne uno tuo.

ODRefreshControl

SlimeRefresh




Risulta che è possibile utilizzare quanto segue quando si utilizza un UIViewController con una sottoview UITableView e conforme a UITableViewDataSource e UITableViewDelegate:

self.refreshControl = [[UIRefreshControl alloc]init];
[self.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];



IOS 10 Swift 3.0

è semplice

import UIKit

class ViewControllerA: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var myTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.delegate = self
        myTableView.dataSource = self

        if #available(iOS 10.0, *) {
            let refreshControl = UIRefreshControl()
            let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh")
            refreshControl.attributedTitle = NSAttributedString(string: title)
            refreshControl.addTarget(self,
                                     action: #selector(refreshOptions(sender:)),
                                     for: .valueChanged)
            myTableView.refreshControl = refreshControl
        }
    }

    @objc private func refreshOptions(sender: UIRefreshControl) {
        // Perform actions to refresh the content
        // ...
        // and then dismiss the control
        sender.endRefreshing()
    }

    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        cell.textLabel?.text = "Cell \(String(indexPath.row))"
        return cell
    }

}

Se vuoi conoscere iOS 10 UIRefreshControl leggi here .




Prova questo,

Le soluzioni di cui sopra vanno bene, ma tableView.refreshControl è disponibile solo per UITableViewController, fino a iOS 9.x ed è disponibile in UITableView da iOS 10.x in poi.

Scritto in Swift 3 -

let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged)
// Fix for the RefreshControl Not appearing in background
tableView?.addSubview(refreshControl)
tableView.sendSubview(toBack: refreshControl)



Related