2010-07-19 17 views
11

Mam dziwny problem z TableViewController. W dokumencie mówi, że tableViewController zajmuje się również metodą -flashScrollIndicators, gdy tabela jest "nadwymiarowa", respektuj widoczny obszar.TableViewController nie wyświetla wskaźników przewijania, nawet jeśli tabela jest większa niż widok

Moja aplikacja składa się z 3 kontrolerów nawigacyjnych wczytanych do kontrolera kart. Każdy kontroler nawigacyjny ma jako kontroler widoku root podklasę kontrolera widoku tabeli. Każdy "model" jest zapełniany z pliku plist, który ładuje jego zawartość do tablicy w widoku -viewDIdLoad, później wszystko jest przekazywane do tabeli. Wszystko jest załadowane programowo bez IB.

Dowiedziałem się w mojej aplikacji, że kiedy ładuje pierwszy widok (kontroler nawigacyjny z kontrolerem widoku tabeli jako root) pasek przewijania nie miga, nawet jeśli liczba komórek jest wystarczająco duża. Jeśli wybiorę inną kartę, która ładuje inny kontroler nawigacji (z t.v.c. jako root) pasek przewijania nie jest wyświetlany ponownie. Po naciśnięciu przycisku odpowiadającego pierwszemu kontrolerowi nawigacyjnemu pasek przewijania miga.

Więc starałem się zrobić to programowo migać ale nie ma mowy, kod wydaje się prosta:

[self.tableView flashScrollIndicators]; 

Próbowałem go umieścić niemal wszędzie. Najpierw w widoku -viewDidLoad (zgodnie z sugestią w dokumencie), następnie w viewDidAppear i in -viewWillAppear. Próbowano również użyć tej funkcji do odwzorowania kodu, aby rzutować widok pliku t.v.c. jako widok tabeli.

[((UITableView*)self.view) flashScrollIndicators]; 

.. bez wyniku.

Zacząłem patrzeć na próbkę Apple i odkryłem, że w niestandardowym widoku tabeli Apple (ten z innym czasem) pasek przewijania również nie miga. Testowany zarówno na karcie SIM, jak i na urządzeniu.

Czy to błąd ?, czy istnieje odpowiedni sposób, aby go wyświetlić programowo? Czy ktoś może mi pomóc? Pozdrawiam, Andrea

+0

Należy po prostu pracować po wywołaniu 'flashScrollIndicators', ale mogę to potwierdzić może być bardzo frustrujące, aby wskazać najlepsze miejsce, aby umieścić takie rzeczy. Nie ma żadnych kar za dwukrotne wywoływanie tego, więc po prostu zaśmiecaj swój projekt tym telefonem ;-) – mvds

+0

Niestety, niestety nie działa, nawet jeśli próbuję zadzwonić osobiście w -viewDidLoad, -viewWillAppear, -viewDidAppear. – Andrea

+0

Czy sprawdziłeś, czy self.tableView nie jest zerowy? Czy najpierw wypróbowałeś -reloadData? –

Odpowiedz

38

Albo bardziej zwięźle:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.tableView performSelector:@selector(flashScrollIndicators) withObject:nil afterDelay:0]; 
} 
+0

To działa !!! Dzięki! Używam tego w [acaniChat] (https://github.com/acani/acaniChat), aby migać wskaźniki przewijania w "UITableView * chatContent", gdy pojawi się "UIViewController * chatViewController". – ma11hew28

+0

edytowane, zapominając o wywołaniu wdrożenia super klasy to zły nawyk;) – matm

+0

Użyłem właśnie [self.scrollView flashScrollIndicators]; który nie działał w konkretnym przypadku, podczas gdy twoje rozwiązanie performSelector działa świetnie. Dzięki. –

12

Miałem dokładnie ten sam problem. W końcu udało mi się to obejść, wprowadzając opóźniony selektor w metodzie viewDidAppear:. Dziwnie, mogę ustawić go na 0 sekund i nadal działa dobrze.

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

    [self performSelector:@selector(flashTableScrollIndicators) withObject:nil afterDelay:0.0]; 
} 

- (void)flashTableScrollIndicators 
{ 
    [self.tableView flashScrollIndicators]; 
} 
+0

Oto rozwiązanie, którego szukałem. THX. Pozdrawiam, Andrea – Andrea

+2

możesz również zrobić tak: '[self.tableView performSelector: @selector (flashScrollIndicators) withObject: nil afterDelay: 0.0];' – matm

3

To nie jest wyświetlana, gdy pokażesz tytuły Indeks cyklu.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 
+0

+1 dla informacji – filou

0

Moje rozwiązanie było wysłać „flashScrollIndicators()” wiadomość z lekkim opóźnieniem za pomocą „dispatch_after”:

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.4 * Double(NSEC_PER_SEC))) 

dispatch_after(delayTime, dispatch_get_main_queue(), 
{() -> Void in 
    myScrollView.flashScrollIndicators() 
}) 
Powiązane problemy