Кнопка отмены UIActionSheet странное поведение

У меня есть UIBarButtonItem, открывающий лист действий, чтобы предложить пользователям выбор того, что делать. Все работает как положено, если я не пытаюсь нажать на кнопку «Отмена». Цель кнопки, кажется, переместилась вверх от того места, где она должна быть. Я могу активировать его только нажатием где-то посередине кнопок «Отмена» и «Ок».

Я пробовал листы действий в других приложениях, и они отлично работают, так что это не просто мой большой палец. Лист действий открывается в 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];
}
29.07.2009 02:11:34
На несвязанной ноте мне сказали на WWDC во время сеанса обзора Apple UI, что красная кнопка на листах действий действительно предназначена для «разрушительных» действий (то есть «удалить»).
Ramin 29.07.2009 17:35:34
Да, я недавно прочитал рекомендации по интерфейсу пользователя и увидел это. Поменял его с красного на серый.
nevan king 30.07.2009 00:56:29
7 ОТВЕТОВ
РЕШЕНИЕ

Вместо того, чтобы передавать текущее представление контроллера представления на лист действий, используйте showFromTabBar:метод UIActionSheet.

Правильный путь
Это даст правильную площадь соприкосновения:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Неправильный путь
Это поместит смещаемую область в неправильное место (если вы используете панель вкладок или панель инструментов):

[actionSheet showInView:self.view];

Если вы используете панель инструментов , используйте showFromToolbar:вместо этого метод. Вам понадобится ссылка на панель инструментов, скорее всего, ивар

[actionSheet showFromToolbar:self.myToolbar];

Мой старый ответ тоже работает, но взломан:

Просто нашел возможный ответ:

01.12.2008 22:22 Tom Saxton: Я еще раз посмотрел на эту ошибку, и, похоже, проблема с панелью вкладок.

Если вы вызываете UIctionSheet [sheet showInView: self.view] из контроллера представления, являющегося дочерним элементом UITabViewController, то проверка нажатия кнопки отмены не выполняется в той части UIActionSheet, которая находится над представлением панели вкладок.

Если вместо этого вы передадите представление UITabBarController, тогда UIActionSheet будет работать как положено.

ПРИМЕЧАНИЕ. В iPhone OS 2.1 и более ранних версиях UIActionSheet отображался в верхней части панели вкладок при передаче дочернего представления, но в версии 2.2 он поднимается в нижней части панели вкладок и, таким образом, охватывает представление вкладок.

http://openradar.appspot.com/6410780

Редактировать: он работает правильно, когда я изменяю вид на представление панели вкладок

[sheet showInView:self.parentViewController.tabBarController.view];
190
24.08.2014 13:07:21
Проголосовал за это, потому что это работает. Почему это лучше, чем другие ответы?
bentford 26.08.2009 02:45:05
Почему parentViewController? Даже если представление находится во вкладке навигационного представления, BarController все равно должен указывать на правильное место. У меня работает без parentViewController в любом случае.
Nathan 30.09.2010 10:48:58
Другой ответ кажется потенциально лучше. Ищите [actionSheet showInView: [окно self.view]]. Кажется более прямым и более общим.
Kevin 20.10.2010 22:37:10
Большое спасибо за размещение этого ответа.
fulvio 30.11.2010 06:23:57
У меня нет панели вкладок в моем приложении, но все еще есть такая проблема. Я решил это с помощью «[serf.view window]». В любом случае это не проблема панели вкладок.
Mike Keskinov 24.02.2012 14:09:39

Я нашел ответ здесь, который работает.

используя [filterActionSheet showInView:[self.view window]]:;

Я попытался несколько способов, чтобы добраться до моей панели вкладок, и они способ, которым это приложение настроено, это кажется запутанным ...

37
23.05.2017 12:09:05
ИДЕАЛЬНО! Спасибо. Это правильное решение для меня, так как у меня была эта проблема с UITableViewController, который имел панель инструментов, а не TabBar, как другие здесь.
William Denniss 14.05.2010 08:09:54
Хорошая вещь, это сработало для меня! это определенно самый простой способ сделать это!
cgossain 7.11.2011 06:52:42
Это вызывает еще одну проблему. ActionSheet отображается в портретной ориентации, когда устройство находится в альбомной ориентации (как и все остальное содержимое).
Mike Keskinov 10.04.2012 19:38:04

Вместо этого используйте:

[sheet showFromTabBar:theTabBar];
22
22.02.2010 22:20:34
Я исправил это от showInTabBar:до showFromTabBar:. Также обратите внимание, что есть метод 'showFromToolbar: `, в зависимости от того, какая у вас экранная мебель в нижней части экрана. Это, я думаю, лучший ответ, чем принятый ответ.
Stephen Darlington 22.02.2010 22:22:44
Стивен, любопытно, почему вы думаете, что это лучше, чем указание showInView: theTabBar? С точки зрения связывания, я думаю, что showInView, вероятно, будет более идеальным, в случае, если позже панель вкладок будет удалена, например, может быть заменена панелью инструментов. Я бы подумал, что конкретный контроллер подчиненного представления не должен знать или заботиться.
Billy Gray 7.05.2010 19:12:13
Если панель вкладок будет удалена позже, вам придется независимо редактировать эту строку кода (если, возможно, theTabBar не является плохо названной ссылкой на представление, которое передается в). Так что я не вижу, как этот метод более связан, чем showInView: theTabBar. Я использую showFromTabBar: также, как мне кажется, безопаснее. Я не знаю, что происходит под прикрытием, но я представляю, что showFromTabBar: менее вероятно сломается в будущих выпусках ОС, чем showFromView: с представлением панели вкладок.
Christopher Pickslay 16.06.2010 23:50:11

К вашему сведению - та же проблема была с таблицей действий UIDocumentInteractionController, ступающей на панель вкладок. Использовал следующее, чтобы исправить.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];
1
27.08.2010 14:30:48

Я думаю, что комбинация из трех ответов является правильным способом решения этой проблемы:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

то есть, используйте showFromTabBar (именно поэтому он существует), и вам не нужен parentViewController, как указал Натан (фактически, self.parentViewController.tabBarController.tabBar для меня возвращает nil.

5
24.11.2011 16:19:53
Конечно, он возвращает nil, потому что родительский контроллер представления (который является UITabBarViewController) не вложен в другой UITabBarController, поэтому его свойство tabBarController равно nil.
Dominik Seibold 24.12.2011 10:40:29

Вот исправление. Попробуйте это:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];
10
18.04.2012 10:38:14

написать упрощенный код

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

эта работа отлично

-2
26.12.2015 06:51:50