Celem jest "uruchomienie grafiki pokrętła na początku widoku ViewAppear, która ładuje dane przed wyświetleniem widoku tabeli", aby użytkownik nie zastanawiał się, dlaczego przed wyświetleniem tabeli wystąpiło opóźnienie. To znaczy. do okna dodano okno UIActivityIndicatorView i chcę ustawić alfa, aby je ukrywał/pokazywał.Awaria - "Kolekcja <CALayerArray: 0x645dfc0> została zmutowana podczas wyliczania."
Ten dziwny błąd pojawia się podczas uruchamiania wątku, aby upewnić się, że wyświetli się widok graficzny "spinning gears" (tag = 333), zanim przejdzie dalej, aby załadować/obliczyć rzeczy w viewWillAppear.
Nie otrzymuję tego za każdym razem, gdy dzwonię do [appdel addGearz] i [appdel removeGearz], dzieje się tak w obu przypadkach i jest losowe. Może się zdarzyć po 2 viewWillAppears lub po 15. Jeśli skomentuję linię ustawiającą alfa, wszystko działa.
Typowym viewWillAppear wygląda mniej więcej tak,
[super viewWillappear];
[email protected]"Products listing"; //and other simple things
[appdel addGearz];
[self getProducts];
[self getThumbnails];
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed
A oto kod, który zawiesza się, jeśli linie z .alpha nie wykomentowane
-(void)addGearz {
[NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil];
}
-(void)removeGearz {
[NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil];
}
- (void)gearzOn {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[window viewWithTag:333].alpha=1.0;
//
// [[window viewWithTag:333] setNeedsDisplay];
[pool drain];
}
- (void) gearzOff {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[window viewWithTag:333].alpha=0.0;
//
// [[window viewWithTag:333] setNeedsDisplay];
[pool drain];
}
Użyłem czyjeś hasło , więc ... coś oczywistego, co widać? Z pewnością muszę mieć możliwość zmiany alfa UIViews w wątku? Czy muszę "osadzić" zmianę alfa w niektórych "przestań wymieniać, gdy zmienię ten" kod?
Nie zrobiłem tego, przesuwając linię zmiany alfa powyżej nadmiaru puli lub poniżej poziomu [odpływu puli], ale potem dostaję dużo "autoreleased bez puli w miejscu - po prostu wyciek" - wiadomości .
Najwyraźniej jest coś, czego nie rozumiem w odniesieniu do tego kodu wątku.
[self performSelectorOnMainThread: @selector (gearzOn) withObject: nil waitUntilDone: YES]; nie aktualizuje natychmiast widoczności, co jest ideą - ponieważ viewWillAppear wykona całe ładowanie zanim widok zostanie przesunięty, użytkownik powinien być świadomy, że coś się dzieje. –
Nie pojawił się z [window setNeedsDisplay]; zarówno. Używanie alfa UIAnimation działało. (Quick fade.) Jakieś pomysły, dlaczego tak działa, ale nie ustawiając alfa i prosząc okno o aktualizację? Oznaczy twoją odpowiedź jako poprawną, rozwiązuje problem. Dzięki! –
Sądzę, że ma on związek z kolejką wyświetlania warstw i sposobem, w jaki przetwarzane są animacje. Dobrze wiedzieć, że UIAnimation załatwił sprawę. –