2013-03-23 7 views
21

Lange Zeit Zuhörer, erstmals Anrufer hier auf Stapelüberlauf. Sei sanft.UIRefreshControl - Wie kann ich die Aktualisierung durchführen, nachdem die Berührung freigegeben wurde?

Ich implementiere UIRefreshControl auf einem UITableView, um die Daten der Tabelle zu aktualisieren. Bei anderen Pull-to-Refresh-Implementierungen beginnt der Refresh-Prozess erst, wenn der Finger des Benutzers im Pull-Refresh-Abstand angehoben wird. UIRefreshControl scheint nicht sofort diese Anpassung zu haben.

Mein UIRefreshControl init Code:

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

Meine refresh: Code ist recht einfach:

-(void)refresh:(id)sender { 
(... refresh code ...) 
[sender endRefreshing]; 
} 

Wie kann ich die Refresh-verzögern: Funktion, bis der Benutzer die Finger aus dem Pull entfernt?

Antwort

25

Ich habe auch mit dem gleichen Problem festgefahren. Ich denke nicht, dass mein Ansatz sehr nett ist, aber es scheint, als ob es funktioniert.

  1. Init UIRefreshControl

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
    self.refreshControl = refreshControl; 
    
  2. prüfen Zustand UIRefreshControl wenn Benutzer Finish den Tisch ziehen (UITableViewDelegate entspricht UIScrollViewDelegate)

    - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView 
    {  
        if(self.refreshControl.isRefreshing) 
         [self refresh]; 
    } 
    
  3. aktualisieren Tabelle

    - (void)refresh 
    { 
        [self.refreshControl endRefreshing]; 
    
        // TODO: Update here your items 
    
        [self.tableView reloadData]; 
    } 
    

Ich hoffe, es wird Ihnen helfen.

+1

Diese Lösung funktioniert, wenn der Benutzer das Ziehen und Ziehen langsam durchführt. Wenn es fast wie ein Streifen ist, wird das Laderad laufen, aber die refresh: -Funktion wird nicht aufgerufen, bis der Tisch wieder bewegt wird. edit: Ich habe die Funktion zu scrollViewDidEndDecelerating geändert: und es scheint jetzt gut zu funktionieren. Vielen Dank! – outphase

+0

Ja, Sie haben recht! Jetzt funktioniert es viel besser, danke für die Korrektur meines Codes!) – Ned

+1

Es gibt ein kleines Problem damit. Wenn Sie die Tischansicht so weit nach unten ziehen, dass Sie sich erfrischen können, halten Sie Ihren Finger nach unten, gehen Sie zurück zu der Stelle, an der der Spinner ungefähr halb sichtbar ist, und lassen Sie ihn dann los, damit sich der Spinner dreht und nichts passiert. –

18

UIRefreshControl hat bereits Unterkünfte für den Beginn der "richtigen" Zeit. Das richtige Verhalten für eine Pull-to-Refresh-Kontrolle besteht darin, die Aktualisierung zu starten, nachdem der Benutzer einen Schwellenwert "weit genug" überschritten hat und nicht, wenn der Benutzer seinen Widerstand freigegeben hat.

Um dies zu erreichen, müssen Sie Ihre -refresh: Methode ändern, um zu überprüfen, wenn die Steuerung in den refreshing Zustand übergegangen ist:

-(void)refresh:(id)sender { 
    UIRefreshControl *refreshControl = (UIRefreshControl *)sender; 
    if(refreshControl.refreshing) { 
     (... refresh code ...) 
    } 
} 

Beachten Sie, dass jede Methode, die Sie für Ihre (... refresh code ...) nennen asynchron sein sollte, damit Ihre Benutzeroberfläche nicht einfriert. Sie sollten in der Hauptwarteschlange ändern und -endRefreshing am Ende Ihres (... refresh code ...) Block aufrufen, statt am Ende des -refresh::

- (void)refresh:(id)sender { 
    __weak UIRefreshControl *refreshControl = (UIRefreshControl *)sender; 
    if(refreshControl.refreshing) { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      /* (... refresh code ...) */ 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [refreshControl endRefreshing]; 
       //reload the table here, too 
      }); 
     }); 
    } 
} 

Ändern der Steuerereignis UIControlEventTouchUpInside wird nicht funktionieren, weil UIRefreshControl kein UI ist Komponente, mit der direkt interagiert werden soll. Der Benutzer wird niemals die UIRefreshControl berühren, damit kein UIControlEventTouchUpInside Ereignis ausgelöst werden kann.

+2

Das ist eigentlich die richtige Antwort! –

+0

es funktioniert nicht. Refresh-Methode nur einmal aufgerufen, bevor der Benutzer den Finger hebt (getestet mit ios 10.2) – user1105951

Verwandte Themen