2014-06-21 9 views
22

Ich habe eine UITableViewController als Root-View-Controller in einem UINavigationController, der wiederum einer der View-Controller in einem UITabBarController ist. Alles im Storyboard.UIRefreshControl nach dem Umschalten Registerkarten in UITabBarController

Ich habe auch die UIRefreshControl für meinen Tisch in der Storyboard konfiguriert, und in der Regel sieht es aus wie es soll beim Ziehen:

Normal UIRefreshControl

Allerdings, wenn ich zwischen meinen anderen Registerkarten ein- oder zweimal wechseln, es sieht wie folgt aus:

Buggy UIRefreshControl

es ist nicht Spinnen oder irgendetwas, nur stecken „voll“, und es bleibt so, bis ich voll und lösen eine Aktualisierung ziehen.

Alle Ideen oder Vorschläge zu schätzen wissen.

+0

sein Kann es einen Fehler in ios selbst? – ilyabreev

+0

Zu viele Lösungen, die nicht funktionieren. – ilyabreev

Antwort

10

Ich weiß, das unglaublich spät ist, aber ich glaube besser spät als nie.

Leider funktionierte keine der gegebenen Antworten für mich. Das einzige, was arbeitete, war dieses schreckliche Stück Code in viewWillAppear:

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

Grundsätzlich ich die UIRefreshControl jedes Mal neu die Ansicht angezeigt wird. Es funktioniert, wenn auch gleichzeitig die folgende Warnung geben:

Der Versuch, die Refresh-Steuer zu ändern, während es nicht untätig ist, dringend abgeraten und wird wahrscheinlich nicht richtig funktionieren.

Ich bin ehrlich überrascht, dass dies immer noch ein Problem ist (immer noch in iOS 9 jetzt sehen). Hoffentlich kann dies für andere Leute hilfreich sein.

+0

Große Antwort! Ich sehe dieses Problem immer noch in iOS 9. Dies muss von Apple in der nächsten Version behoben werden. –

+1

Sieht aus wie dieser Fehler in iOS 10 gelöst wurde. – timgcarlson

+1

@timgcarlson Für mich in iOS 10 ist es nicht gelöst. –

2

Ich habe gerade das Gleiche gesehen. Was ich getan habe, ist endRefreshing auf viewWillDisappear und das beseitigt dieses Problem zumindest. Aber zurück zu der Registerkarte erwarte ich es wieder zu starten, wie ich den Aktualisierungsvorgang neu starten und beginRefreshing erneut aufrufen, aber es tut nicht. Es ist in dem Fall, wenn ich Navigation navigiere und dann zurückkomme.

11

user2009606 war fast richtig, ich es fest von

[refreshControl endRefreshing]; 

Auf

Aufruf
viewWillAppear: 

Die refreshControl jetzt verhält sich richtig nach Tabulatoren, unabhängig von seinem Zustand umgeschaltet wird.

4

Die folgende Lösung kann Ihnen helfen.

0

Ich habe eine CollectionView, und ich habe es contentInset gesetzt.

Wenn Sie einige ViewController drücken, drücken Sie die Home-Taste und gehen Sie zurück und zurück, das UIRefreshControl ist immer oben.

Schließlich verwende ich diesen Code vorübergehend zu vermeiden. (Hässlich, aber hält es zeigt immer oben)

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    [self.refreshControl endRefreshing]; 

    CGPoint currentContentOffset = self.collectionView.contentOffset; 

    [self.collectionView setContentOffset:CGPointMake(currentContentOffset.x, 
                 currentContentOffset.y - 1.0f) 
           animated:YES]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    CGPoint currentContentOffset = self.collectionView.contentOffset; 

    [self.collectionView setContentOffset:CGPointMake(currentContentOffset.x, 
                 currentContentOffset.y + 1.0f) 
           animated:YES]; 
} 
4

Zusammenfassend und bieten eine vollständige Lösung.

Das Problem:

Wenn UIRefreshControl während Bildschirm Übergang animieren, wird es sichtbar bleiben, aber wird Animieren nicht. Video https://vid.me/Bkb7

Auch, wenn Pull, um Animation aktualisiert wurde gestartet, aber nicht abgeschlossen, und dann wurde der Übergang durchgeführt, UIRefreshControl wird versteckt, aber fest. Video https://vid.me/Bkb7

Lösung:

starten UIRefreshControl Animation auf viewWillAppear und es auf viewDidDisappear beenden. Speichern Sie den Aktualisierungsstatus, um zu wissen, wann UIRefreshControl angezeigt werden soll.

Bellow ist die ganze Lösung, die auch die richtige Animation und einfaches Pull, um Animation zu aktualisieren behandelt.

In den UITableView oder Unterklasse

Initialisierung:

/// Refresh indicator 
var refreshControl = UIRefreshControl() 

/// Refresh state 
var isRefreshing = false 

/// Refresh controll update funcion. Set to enable pull to refresh 
var refreshControllUpdateFunction: (() ->())? 

/// Prepeares UIRefreshControll. Call from init 
func initRefreshControl(){ 
    addSubview(refreshControl) 

    refreshControl.addTarget(self, action: "refreshControllTarget", forControlEvents: .ValueChanged) 
    refreshControl.beginRefreshing() 

    isRefreshing = true 
} 

Superview Event-Handler:

/// Call on viewWillApper 
func superviewWillApper(){ 
    if isRefreshing && !refreshControl.refreshing{ 
     startRefreshAnimation() 
    } 
} 

/// Call on viewDidDisapper 
func superviewDidDisappear(){ 
    endRefreshAnimation(false, dataFetched: !isRefreshing) 
} 

UIRefreshControl Animation Handler:

/// Presents animating UIRefreshControll 
func startRefreshAnimation(){ 
    refreshControl.beginRefreshing() 
    contentOffset = CGPointMake(0, -refreshControl.bounds.size.height) 

    isRefreshing = true 
} 

/// Hides UIRefreshControll and saves state of refresh 
func endRefreshAnimation(wasEmpty: Bool, dataFetched: Bool){ 
    refreshControl.endRefreshing() 

    isRefreshing = !dataFetched 

    if !wasEmpty{ 
     setContentOffset(CGPointZero, animated: true) 
    }else{ 
     setContentOffset(CGPointZero, animated: false) 
    } 
} 

Add

table.isRefreshing = true 

Anfang der Refresh-Aufruf.

Ergebnis Video https://vid.me/LyuI

4

Einfach telefonieren endRefreshing in viewWillDisappear: für mich alle Probleme behoben.

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.refreshControl endRefreshing];   
} 

die gleiche Sache in viewWillAppear: tun verursacht die Auffrischungssteuer seltsam zu drehen, wenn die Tabelle ziehen.

+1

Arbeitete für mich .. – Manuel

0

Ich möchte einige Punkte und wie Albert Lösung, aber nicht seinen Stil.

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    _table.contentOffset = CGPointMake(_table.contentOffset.x, _table.contentOffset.y + 1.0f); 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    _table.contentOffset = CGPointMake(_table.contentOffset.x, _table.contentOffset.y - 1.0f); 
} 
0

Hoffe, dass ich endlich dieses Problem lösen helfen:

Es gibt ein Problem UITableView mit einer Pull-To-Refresh-Steuerung. Dies kann leicht gelöst werden, indem ein UITableViewController hinzugefügt wird.

UITableViewController *tableController = [[UITableViewController alloc] init]; 
    tableController.automaticallyAdjustsScrollViewInsets = NO; 
    [tableController willMoveToParentViewController:self]; 
    [self addChildViewController:tableController]; 
    tableController.tableView = self.containerTableView; 
    tableController.refreshControl = self.refreshControl; 

So können Sie Ihre UITableView, für die in einem Controller wickeln nur die [self.refreshControl endRefreshing] innerhalb viewWillAppear oder viewWillDisappear ganz gut funktionieren wird.In einigen Fällen müssen Sie es möglicherweise in beiden Fällen aufrufen.

Hoffe, das hilft! :)

0

Ich konnte den Aufruf von endRefreshing nicht funktionieren, bevor die Navigation passierte, also näherte ich das Problem vom anderen Ende und auf viewWillAppear überprüfe ich, ob TableView contentOffset eine negative Zahl ist, bringe die tableView zurück auf 0.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if (self.tableView.contentOffset.y < 0) 
    { 
     [self.tableView setContentOffset:CGPointZero animated:YES]; 
    } 
} 
0

die Antworten in diesem question mein Problem gelöst

grundsätzlich stoppen und starten den Spinner wieder auf viewWillAppear

0

Nach mehrmals in das gleiche Problem laufen I beschlossen, eine Bibliothek dafür zu machen SwiftPullToRefresh.

Wie bereits erwähnt, muss refreshControl auf viewDidDisappear(_:) gestoppt und unter viewWillAppear(_:) gestartet werden.

Wenn die Animation refreshControl programmatisch gestartet wird, muss tableView.contentOffset auf den entsprechenden Wert eingestellt werden.

tableView.setContentOffset(CGPoint(x: 0, y: -(refreshControl?.bounds.height ?? 60) - topOffset), animated: true) 

var topOffset: CGFloat { 
    if let navigationBar = navigationController?.navigationBar, navigationBar.isTranslucent == true { 
     return navigationBar.bounds.height + UIApplication.shared.statusBarFrame.height 
    } else { 
     return 0 
    } 
} 
1

Netteste fix in Swift:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    //fixes bug with refreshControl freezing while switching tabs 
    if tableView.contentOffset.y < 0 { 
    tableView.contentOffset = .zero 
    } 
} 
Verwandte Themen