2009-07-29 13 views
114

Mam UIBarButtonItem otwierając arkusz akcji, aby zaoferować użytkownikom wybory dotyczące tego, co robić. Wszystko działa zgodnie z oczekiwaniami, chyba że spróbuję kliknąć przycisk "Anuluj". Wygląda na to, że cel przycisku przesunął się z miejsca, w którym powinien być. Mogę go aktywować, klikając gdzieś pośrodku przycisków "Anuluj" i "Ok".UIActionSheet przycisk anulowania dziwne zachowanie

alt text http://img.skitch.com/20090729-t994x5g3ka5sksi7sskt7is5mi.jpg

Próbowałem na arkuszach działania w innych aplikacjach i działają dobrze, więc nie jest to tylko mój wielki kciuk. Arkusz działania jest otwarcie 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]; 
} 
+5

Na niepowiązanych notatki, powiedziano mi na WWDC podczas sesji przeglądarki Jabłko UI że czerwony przycisk na arkuszach działania jest naprawdę przeznaczonej do działań „destrukcyjnych” (to znaczy 'kasować'). – Ramin

+0

Tak, ostatnio przeczytałem wytyczne dotyczące interfejsu użytkownika i zobaczyłem to. Zmieniłem go z czerwonego na szary. –

Odpowiedz

190

Zamiast przechodzenia widok bieżący kontroler widok do arkusza działania, stosowanie metody UIActionSheetshowFromTabBar:.

The Right Way
To da poprawną powierzchnię tappable:

[actionSheet showFromTabBar:self.tabBarController.tabBar]; 

wspak
wywrze to obszar tappable w niewłaściwym miejscu (jeśli przy użyciu pasek zakładek lub pasek narzędzi):

[actionSheet showInView:self.view]; 

Jeśli używasz g na pasku narzędziowym, zamiast tego użyj metody showFromToolbar:. Musisz odniesienie do paska narzędzi, najprawdopodobniej Ivar

[actionSheet showFromToolbar:self.myToolbar]; 

My Old Odpowiedź działa także, ale to hacky:

Wystarczy znaleźć możliwą odpowiedź:

01-Dec-2008 22:22 Tom Saxton: Spojrzałem na ten bug jeszcze trochę i wydaje się, że jest to problem z tabbar.

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

Jeśli zamiast tego przejdziesz w widoku UITabBarController, wówczas UIActionSheet działa zgodnie z oczekiwaniami.

UWAGA: w systemie iPhone OS 2.1 i wcześniejszych, arkusz UIActionSheet pojawił się z góry paska zakładek po przejściu widoku podrzędnego, ale w wersji 2.2 pojawia się od dołu paska kart, a tym samym obejmuje widok kart.

http://openradar.appspot.com/6410780

Edit: To działa prawidłowo, kiedy zmienić widok za pasek kart na widok

[sheet showInView:self.parentViewController.tabBarController.view]; 
+14

Pomogłeś mi rozwiązać problem, którego nie znałem! –

+0

Wycofano to, ponieważ działa. Dlaczego jest to lepsze niż inne odpowiedzi? – bentford

+0

Odpowiedź, która pomaga ... miłej pracy! – pchap10k

37

znalazłem odpowiedź na here że działa.

za pomocą: [filterActionSheet showInView:[self.view window]];

próbowałem kilka sposobów, aby dostać się do mojego paska kart i droga ta aplikacja jest skonfigurowana się wydawać zawiłe ...

+0

PERFECT! Dzięki. To jest poprawne rozwiązanie dla mnie, ponieważ miałem ten problem z UITableViewController, który miał pasek narzędzi * nie * TabBar jak inni tutaj. –

+0

Działa dla mnie! Dzięki! – nonamelive

+0

Dobre rzeczy, to działało dla mnie! jest to zdecydowanie najłatwiejszy sposób na zrobienie tego! – cgossain

22

Zamiast używać:

[sheet showFromTabBar:theTabBar]; 
+1

Poprawiłem to z 'showInTabBar:' na 'showFromTabBar:'. Zauważ też, że istnieje metoda "showFromToolbar:", w zależności od tego, jakie meble ekranowe masz na dole ekranu. To, jak sądzę, jest lepszą odpowiedzią niż zaakceptowana odpowiedź. –

+0

Stephen, ciekawy dlaczego uważasz, że to jest lepsze niż określenie showInView: theTabBar?Z perspektywy sprzężenia uważam, że showInView byłby prawdopodobnie bardziej idealny, na wypadek gdyby później tabBar został upuszczony, może na przykład zastąpiony przez pasek narzędzi. Ten konkretny kontroler podrzędny nie powinien tak naprawdę wiedzieć ani się tym przejmować. –

+0

Jeśli pasek kart zostanie upuszczony później, będziesz musiał edytować ten wiersz kodu bez względu na to (chyba że TABBar jest słabo nazwanym odnośnikiem do widoku, który został przekazany). Więc nie widzę jak ta metoda jest bardziej sprzężona niż showInView: theTabBar. Używam showFromTabBar: jak również, ponieważ wydaje mi się bezpieczniejsze dla mnie. Nie wiem, co się dzieje pod kołdrą, ale wyobrażam sobie, że showFromTabBar: jest mniej prawdopodobne, że złamie się w przyszłych wersjach systemu operacyjnego niż showFromView: z widokiem z paska kart. –

1

FYI - miałem ten sam problem z Arkusz UIDocumentInteractionController kroczący po pasku zakładek. Zastosowano następujące rozwiązania, aby naprawić.

UIViewController *parentView = [[self parentViewController] parentViewController]; 
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES]; 
5

myślę kombinacja trzech odpowiedzi jest właściwym sposobem postępowania to:

[actionSheet showFromTabBar:self.tabBarController.tabBar]; 

czyli używać showFromTabBar (dlatego istnieje) i nie trzeba się parentViewController jako Nathan wskazał (w rzeczywistości self.parentViewController.tabBarController.tabBar zwraca nil dla mnie

+0

Oczywiście zwraca zero, ponieważ macierzysty kontroler widoku (który jest UITabBarViewController) nie jest zagnieżdżony w innym UITabBarController, więc jego właściwość tabBarController jest zerowa. –

10

Oto fix.Try to:.

[actionsheet showInView:[UIApplication sharedApplication].keyWindow]; 
+0

To działa dla mnie, dziękuję. –

-2

zapisu kod SimpLite

actionSheet.actionSheetStyle = UIActionSheetStyleDefault; 

ta praca dobrze