Dziwne zachowanie przycisku anulowania arkusza UIActionSheet

116

Mam UIBarButtonItem otwierający arkusz akcji, aby zaoferować użytkownikom wybór tego, co mają zrobić. Wszystko działa zgodnie z oczekiwaniami, chyba że spróbuję kliknąć przycisk „Anuluj”. Wydaje się, że cel przycisku przesunął się w górę z miejsca, w którym powinien. Mogę go aktywować tylko poprzez kliknięcie gdzieś pośrodku przycisków „Anuluj” i „OK”.

Wypróbowałem arkusze akcji w innych aplikacjach i działają dobrze, więc to nie tylko mój wielki kciuk. Arkusz akcji otwiera się w UIViewController

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}
Nevan King
źródło
5
Z drugiej strony, powiedziano mi w WWDC podczas sesji przeglądu interfejsu Apple, że czerwony przycisk w Arkuszach akcji jest naprawdę przeznaczony do działań „destrukcyjnych” (tj. „Usuń”).
Ramin
Tak, ostatnio przeczytałem wytyczne dotyczące interfejsu użytkownika i to widziałem. Zmieniono go z czerwonego na szary.
nevan king

Odpowiedzi:

190

Zamiast przekazywać widok bieżącego kontrolera widoku do arkusza akcji, użyj showFromTabBar:metody UIActionSheet.

Właściwy sposób
Zapewni to właściwy obszar do dotknięcia:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Niewłaściwy sposób
Spowoduje to umieszczenie obszaru do kliknięcia w niewłaściwym miejscu (jeśli używasz paska kart lub paska narzędzi):

[actionSheet showInView:self.view];

Jeśli używasz paska narzędzi , użyj showFromToolbar:zamiast tego metody. Będziesz potrzebować odniesienia do paska narzędzi, najprawdopodobniej ivar

[actionSheet showFromToolbar:self.myToolbar];

Moja stara odpowiedź też działa, ale jest zepsuta:

Właśnie znalazłem możliwą odpowiedź:

01-grudnia-2008 22:22 Tom Saxton: Przyjrzałem się temu błądowi i wydaje się, że jest to problem z paskiem tabulacji.

Jeśli wywołasz [arkusz showInView: self.view] UIActionSheet z kontrolera widoku, który jest elementem podrzędnym UITabViewController, test trafień na przycisku anulowania kończy się niepowodzeniem w tej części arkusza UIActionSheet, która znajduje się nad widokiem paska kart.

Jeśli zamiast tego przekażesz widok UITabBarController, arkusz UIActionSheet będzie działał zgodnie z oczekiwaniami.

UWAGA: w systemie iPhone OS 2.1 i wcześniejszych arkusz UIActionSheet pojawiał się u góry paska kart, gdy przechodzisz przez widok potomny, ale w wersji 2.2 pojawia się u dołu paska kart, a tym samym zakrywa widok zakładek.

http://openradar.appspot.com/6410780

Edycja: Działa poprawnie, gdy zmienię widok na widok paska kart

[sheet showInView:self.parentViewController.tabBarController.view];
Nevan King
źródło
Głosowałem za tym, ponieważ to działa. Dlaczego to jest lepsze niż inne odpowiedzi?
bentford
1
Dlaczego parentViewController? Nawet jeśli widok znajduje się na karcie Navigationview, BarController powinien nadal wskazywać właściwe miejsce. W każdym przypadku działa dla mnie bez parentViewController.
Nathan
11
Inna odpowiedź wydaje się potencjalnie lepsza. Poszukaj [actionSheet showInView: [self.view window]]. Wydaje się prostsze i bardziej ogólne.
Kevin
Dziękuję bardzo za opublikowanie tej odpowiedzi.
fulvio
1
Nie mam paska zakładek w mojej aplikacji, ale nadal mam taki problem. Rozwiązałem to za pomocą „[serf.view window]”. I tak nie jest to problem z paskiem kart.
Mike Keskinov
37

Znalazłem tutaj odpowiedź , która działa.

przy użyciu [filterActionSheet showInView:[self.view window]]:;

Wypróbowałem kilka sposobów, aby dostać się do mojego paska kart i sposób, w jaki ta aplikacja jest skonfigurowana, wydaje się skomplikowana ...

kierowca
źródło
IDEALNY! Dzięki. To jest dla mnie poprawne rozwiązanie, ponieważ miałem ten problem z UITableViewController, który miał pasek narzędzi, a nie TabBar, jak inne tutaj.
William Denniss
dobra rzecz, to zadziałało dla mnie! jest to zdecydowanie najłatwiejszy sposób!
cgossain
2
To powoduje kolejny problem. ActionSheet pojawia się w orientacji pionowej, gdy urządzenie jest ustawione poziomo (a także wszystkie inne treści).
Mike Keskinov
22

Zamiast tego użyj:

[sheet showFromTabBar:theTabBar];
Corey Floyd
źródło
1
Poprawiłem to z showInTabBar:do showFromTabBar:. Zauważ również, że istnieje metoda 'showFromToolbar:', w zależności od tego, jakie meble ekranowe masz na dole ekranu. Myślę, że jest to lepsza odpowiedź niż zaakceptowana odpowiedź.
Stephen Darlington
Stephen, ciekawy, dlaczego uważasz, że jest to lepsze niż określenie showInView: theTabBar? Z perspektywy sprzężenia wydaje mi się, że showInView byłby prawdopodobnie bardziej idealny, na wypadek gdyby później pasek tabBar został usunięty, może być zastąpiony na przykład paskiem narzędzi. Myślę, że konkretny kontroler widoku podrzędnego nie powinien tak naprawdę wiedzieć ani o tym dbać.
Billy Grey
Jeśli pasek kart zostanie później upuszczony, będziesz musiał edytować ten wiersz kodu niezależnie (chyba że pasek TabBar jest słabo nazwanym odwołaniem do przekazanego widoku). Więc nie widzę, jak ta metoda jest bardziej powiązana niż showInView: theTabBar. Używam również showFromTabBar:, ponieważ wydaje mi się to bezpieczniejsze. Nie wiem, co się dzieje pod okładkami, ale wyobrażam sobie, że showFromTabBar: jest mniej prawdopodobne, że zepsuje się w przyszłych wersjach systemu operacyjnego niż showFromView: z widokiem paska kart.
Christopher Pickslay
10

Oto poprawka, spróbuj tego:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];
Viggnesh
źródło
5

Myślę, że połączenie trzech odpowiedzi jest właściwym sposobem rozwiązania tego problemu:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

tj. użyj showFromTabBar (dlatego istnieje) i nie potrzebujesz parentViewController, jak zauważył Nathan (w rzeczywistości self.parentViewController.tabBarController.tabBar zwraca dla mnie nil.

RawMean
źródło
Oczywiście zwraca nil, ponieważ nadrzędny kontroler widoku (którym jest UITabBarViewController) nie jest zagnieżdżony w innym UITabBarController, więc jego właściwość tabBarController ma wartość nil.
Dominik Seibold
1

FYI - miał ten sam problem z arkuszem akcji UIDocumentInteractionController przechodzącym na pasek zakładek. Wykorzystano następujące elementy, aby naprawić.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];
Mickey
źródło
-2

pisać uproszczony kod

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

to działa dobrze

jayesh kavathiya
źródło