2015-09-07 17 views
14

Próbuję zmienić moje UIAlertViews na UIAlertControllers. Skonfigurowałem tę akcję dla niego:UIAlertAction handler running after delay

UIAlertAction *undoStopAction = [UIAlertAction actionWithTitle:@"Undo Stop" 
                 style:UIAlertActionStyleDefault 
                 handler:^(UIAlertAction *action) { 
                  [self undoStop]; 
                 }]; 

Ale handler nie działa przez około sekundę po dotknięciu akcji. Czy jest jakiś sposób, aby to przyspieszyć?

+1

Czy robisz coś na głównym wątku? – Larme

+1

Czy używasz tego wewnątrz metody/bloku tła – soulshined

+0

, jeśli nie wyświetlasz alertu za pomocą głównego wątku, a następnie zrób to w głównym wątku. –

Odpowiedz

3

Krótkie opóźnienie jest normalne w widoku Alert (mniej niż sekunda). Jeśli nie jest to dla Ciebie wygodne, możesz programowo utworzyć widok obejmujący ekran z etykietą i przyciskiem, w zasadzie dostosowany widok alertów.

+0

Dzięki. Poprzednio miałem to jako UIAlertView, ze szczególnym zachowaniem, gdy został naciśnięty przycisk art. To zawsze było natychmiastowe. Sądzę, że nadal będę to robił, nawet jeśli jest przestarzały. –

0

Zgodnie z komentarzem pozostawionym przez Pana T, możliwe jest, że przewodnik nie jest wywoływany w głównym wątku, co może wyjaśnić opóźnienie. Spróbuj osadzić swój kod obsługi w:

dispatch_async(dispatch_get_main_queue()) { 
<your code> 
} 

i sprawdź, czy nadal masz opóźnienie.

+0

Bez zmian. Wygląda na to, że program obsługi nie zostanie wykonany dopiero po chwili. W przeciwieństwie do tego, jak to było, kiedy użyłem UIAlertView –

0

Jest pół-rozwiązanie tutaj:

The handler of a UIAlertAction is a bit too late - how can I make it immediate?

Zasadniczo podklasy powiadomienie kontrolera i uruchomienia obsługi na viewWillDisappear. Możesz przechowywać blok przewodnika na kontrolerze alertów.

Problem z tym rozwiązaniem polega na tym, że nie można uruchomić programu obsługi na przycisk, jak to tylko możliwe, jeśli doda się akcję (akcje) za pomocą UIAlertAction. To główne ograniczenie.

Jednak to rozwiązanie sprawdziło się (ponieważ próbowałem dodać widok tła za alertem po pojawieniu się alertu i sprawić, że będzie on ożywiony alertem po zniknięciu alertu ... pierwotnie próbowałem zrobić to z naciśnięcie przycisku, ale to nie zadziałało z powodu opóźnienia obsługi).