Кнопка UIActionSheet cancel button странное поведение

У меня есть 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];
}

Ответ 1

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

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

[actionSheet showFromTabBar:self.tabBarController.tabBar];

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

[actionSheet showInView:self.view];

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

[actionSheet showFromToolbar:self.myToolbar];

Мой старый ответ Также работает, но хакен:

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

01-Dec-2008 10:22 PM Том Сакстон: Я еще раз посмотрел на эту ошибку и, похоже, проблема с вкладкой.

Если вы вызываете UIActionSheet [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];

Ответ 2

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

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

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

Ответ 3

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

[sheet showFromTabBar:theTabBar];

Ответ 4

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

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

Ответ 5

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

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

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

Ответ 6

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

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

Ответ 7

написать простой код

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

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