6

W aplikacji na iPhone'a chcę dodać wskaźnik aktywności na górze paska wyszukiwania.Wskaźnik aktywności zintegrowany z paskiem wyszukiwania nie jest wyświetlany w telefonie iPhone SDK

Podczas wyszukiwania powinien wyświetlić wskaźnik aktywności.

Dodałem wskaźnik aktywności w XIB i utworzyłem jego ujście.

Ukrywam, gdy wyszukiwanie się zakończy.

, ale wskaźnik aktywności nie jest wyświetlany.

Problem

zorientowali się, że funkcja wyszukiwania (powiedzmy A) (gdzie animować wskaźnik aktywności) z kolei wywołuje inną funkcję (powiedzmy B), więc główny wątek jest używany przy wykonywaniu funkcja B. Jednak do animacji wskaźnika aktywności wymagany jest główny wątek.

Tak więc próbowałem wywoływać funkcję B przy użyciu metody performSelectorInBackGround:withObject. Teraz po kliknięciu przycisku wyszukiwania wyświetlany jest wskaźnik aktywności, ale funkcja B nie jest wykonywana.

Co może być do roboty?

proszę o pomoc i sugerują

Dzięki

+0

W jaki sposób ukrywasz/wyświetlasz/animujesz wskaźnik aktywności? Pomoże to opublikować kod. – Jumhyn

+0

próbowałeś umieścić go gdzieś indziej na widoku, aby sprawdzić, czy to działa? Być może jako pierwszy responder pasek wyszukiwania znajduje się nad wskaźnikiem aktywności. – Julien

Odpowiedz

0

Dzięki do wszystkich facetów za waszą ogromną pomoc i za docenienie tego pytania.

Przepraszam tych, którym nie mogłem odpowiedzieć.

Mam rozwiązanie i jest w następujący sposób.

Właśnie napisałem poniższy wiersz w zdarzeniu kliknięcia przycisku Wyszukaj.

[NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];

i zdefiniowanych funkcji threadStartAnimating: następująco:

-(void)threadStartAnimating:(id)data 
{ 
    [activityIndicator setHidden:NO]; 
    [activityIndicator startAnimating]; 
} 

Hope this helps kogoś.

Jeszcze raz dziękuję.

1

nie ma dosyć w swoim pytaniu iść dalej, ale aby rozpocząć debugowanie, chciałbym wykonać następujące czynności.

  1. Sprawdź, czy zmienna aktywności jest rzeczywiście podłączona do wskaźnika UIActivity, który tworzysz w IB. (Ustawiłabym punkt przerwania na liniach setHidden: i upewnij się, że zmienna nie ma wartości NULL lub rzuć NSAssert (aktywność, @ "Whoops! Actity jest pusta"); tam.)

  2. Jeśli zmienna jest rzeczywiście ustawione, zacznę sprawdzać, czy jest we właściwym miejscu w hierarchii widoku. (Próbowałbym wykonać [self.view addSubview: aktywność] i zobaczyć, że się pojawi.Możesz go zastąpić gdzieś indziej.)

  3. Możesz także chcieć go domyślnie włączyć w IB, dopóki wszystko nie zostanie wymyślone.

Powodzenia. Mam nadzieję że to pomoże.

+0

Dzięki za twój wkład. W rzeczywistości jest to problem stworzony, ponieważ wskaźnik aktywności nie otrzymuje wymaganego głównego wątku, o czym wspomniałem w moim pytaniu. Zmieniłem moje pytanie. Co można zrobić? –

+0

Jeśli możesz opublikować swój kod viewController, mogę rzucić okiem. Ale z drugiej strony myślę, że twoje obawy dotyczące wątków prawdopodobnie nie stanowią problemu. W oparciu o wszystko, co przeczytałem na tej stronie, moim największym podejrzeniem jest to, że wskaźnik aktywności znajduje się w niewłaściwym miejscu w hierarchii widoku. –

0

Przede wszystkim upewnij się, że masz aktywność @synthesize u góry pliku .m. Następnie w metodzie viewDidLoad wpisz activity.hidesWhenStopped = TRUE;. Następnie w metodzie, która jest wywoływana podczas wyszukiwania, wpisz [activity startAnimating]; i [activity stopAnimating]; w metodzie, gdy wyszukiwanie zostanie zatrzymane.

+0

Wykonałem czynność @synthesize. Jeśli chodzi o startAnimating i stopAnimating, to właśnie to robię. Zapoznaj się z powyższym komentarzem na pytanie dotyczące ukrywania/pokazywania/animowania wskaźnika aktywności. Co powinienem zrobić dalej? –

+0

Sprawdź, czy nie ma żadnych ostrzeżeń w programie budującym interfejs. Jeśli są, znajdą się w dolnym rogu pliku .xib. – Jumhyn

+0

Nie, nie ma żadnych ostrzeżeń nawet w XIB. Wydaje się, że problem powstaje, ponieważ wskaźnik aktywności nie ma wymaganego głównego wątku, jak wspomniałem w moim pytaniu. Zmieniłem moje pytanie. Co można zrobić? –

0

spróbuj tego:

ustawić hidesWhenStopped = NO, dzięki czemu jest wyświetlany przez cały czas, a następnie ukryć i pokazać go ręcznie. Ale widok powinien być ustawiony w IB, aby był najpierw ukryty.

- (void)startActivityView { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    activity_view.hidden = NO; 
    [pool drain]; 
} 

- (void)stopActivityView { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    activity_view.hidden = YES; 
    [pool drain]; 
} 

- (void)doSomething { 
    [self performSelectorInBackground:@selector(startActivityView) withObject:nil]; 
    // do some time consuming work 
    [self performSelectorInBackground:@selector(stopActivityView) withObject:nil]; 
} 
+0

thanx iPortable Sprawdzę twoje rozwiązanie :) –

+0

Nie działa !! Pokazuje wskaźnik aktywności po wyświetleniu widoku. To nie jest wymagane. Powinien pokazywać się tylko wtedy, gdy wyszukiwanie jest dotknięte. Nawet próbowałem ukryć go na viewWillAppear, ale nadal pokazuje się, gdy pojawia się widok. Co powinienem zrobić? –

+0

ustawić ukrytą właściwość w IB lub uruchomić stopActivityView w viewWillAppear zamiast po prostu ustawić ukrytą właściwość na NIE –

1

Oszczędzaj sobie trud tworzenia niestandardowego wskaźnika aktywności i korzystaj ze standardowego, który jest już dostępny - na górnym pasku. Również użytkownicy IMO mają skłonność do tego, aby się kręcić, gdy coś się dzieje.

UIApplication* app = [UIApplication sharedApplication]; 
app.networkActivityIndicatorVisible = YES; 

Ustaw na NIE po zakończeniu aktywności.

+0

Wskaźnik aktywności sieci powinien być rzeczywiście używany tylko do działania w sieci. Jeśli PARTH szuka w lokalnej bazie danych, wskaźnik aktywności sieci nie jest odpowiedni. –

0

Być może masz widok przed wskaźnikiem aktywności? Co jeśli zawsze doprowadzić go do przodu ....

loadView = [[UIActivityIndicatorView alloc] 
      initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
loadView.frame = CGRectMake(0.0, 0.0, 40.0, 40.0); 
loadView.center = window.center; 
loadView.opaque = NO; 
[window addSubview: loadView]; 
[window bringSubviewToFront:loadView]; 
[loadView startAnimating]; 
0

Sugeruję użyć DSActivityView za okazanie wskaźnik aktywności. Kod źródłowy można znaleźć pod adresem Dejal blog.

Pokazywanie i ukrywanie widoku aktywności to prosta linia kodu.

[DSActivityView activityViewForView:self.view];

0

początek animacji wskaźnik aktywności i z opóźnieniem wynoszącym 0,1 lub 0,2 po prostu zadzwonić druga metoda u chcą .... próbowałem i to działa na mnie ....

Powiązane problemy