Trek om UITableView te vernieuwen zonder UITableViewController

Ik probeer een pull-to-refresh-functie te implementeren in een UITableView binnen een UIViewController. Ik kan geen UITableViewController gebruiken omdat ik wil dat de UITableView een kleinere subview is in de view-controller, met wat andere dingen erboven. Ik neem aan dat dit mogelijk is, maar heeft iemand een implementatie ervan gezien?


Antwoord 1, autoriteit 100%

Voeg een verversingsbesturingselement rechtstreeks toe aan een UITableViewzonder een UITableViewControllerte gebruiken:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)
    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

Antwoord 2, autoriteit 3%

Objective-C:

Zo kunt u pull-to-refresh implementeren voor tabelweergave.
Hetzelfde als in het geval van de collectieweergave. Vervang de tabelweergave alloc door de collectieweergave.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];
UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];
#pragma mark - Handle Refresh Method
-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}

Antwoord 3

Deze oplossing van @berik werkt prima, maar de UIController wordt weergegeven bovenop de UITableViewController. De manier om het op te lossen is door deze wijziging aan te brengen:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}
func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

Antwoord 4

Ik heb EGORefreshTableHeaderView geïmplementeerd met een UIViewController en een eenvoudige tabelweergave, de truc is dat a op de plaatsen waar EGO een scrollweergave als parameter gebruikt, als je kijkt, de tabelweergave zelf erft van de scrollweergave.

Het vereist alleen dat en een paar extra verbindingen 🙂

Hopelijk helpt dit.


Antwoord 5

Het lijkt erop dat als je de UIRefreshControl maakt binnen de viewController’s loadViewmethode, alles goed werkt. De UIRefreshControl gedraagt ​​zich zoals het hoort. Getest met iOS 7.1 en iOS 8.2


Antwoord 6

Ik heb uiteindelijk ODRefreshControlgebruikt.
Het heeft geen hack nodig zoals de bovenstaande tableView.backgroundView = refreshControl, werkt bijna op dezelfde manier en geeft een mooiere gebruikersinterface.

Other episodes