Кнопка скасування UIActionSheid дивна поведінка


116

У мене є 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];
}

5
На незв’язній записці мені на WWDC під час огляду розширення інтерфейсу Apple сказали, що червона кнопка в аркушах дій дійсно призначена для "руйнівних" дій (тобто "видалення").
— Рамін

Так, я нещодавно прочитав рекомендації щодо людського інтерфейсу і побачив це. Змінив його з червоного на сірий.
— король Неван

Відповіді:


190

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

Правильний шлях
Це дасть правильну область, яку можна натиснути:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Неправильний спосіб
Це дозволить поставити область, яку можна натискати, в неправильному місці (якщо ви використовуєте панель вкладок або панель інструментів):

[actionSheet showInView:self.view];

Якщо ви використовуєте панель інструментів , використовуйте showFromToolbar:метод замість цього. Вам знадобиться посилання на панель інструментів, швидше за все, ivar

[actionSheet showFromToolbar:self.myToolbar];

Моя стара відповідь також працює, але гакітна:

Щойно знайшов можливу відповідь:

01 грудня 2008 р. 22:22 Том Сакстон: Я ще раз подивився на цю помилку, і, здається, це проблема з панеллю вкладок.

Якщо ви викликаєте [аркуш showInView: self.view] UIActionSheet від контролера перегляду, який є дочірньою програмою UITabViewController, то тест натискання кнопки скасування закінчується в тій частині таблиці UIActionSheet, що лежить над поданням панелі вкладок.

Якщо замість цього перейти до подання UITabBarController, то UIActionSheet діє як очікувалося.

ПРИМІТКА: в iPhone OS 2.1 і новіших версіях UIActionSheet з’явилася вгорі панелі вкладок при переході дочірнього перегляду, але в 2.2 вона виходить знизу панелі вкладок і таким чином охоплює подання вкладки.

http://openradar.appspot.com/6410780

Edit: Це працює правильно , коли я змінити вид бути вид на вкладку бару

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

Викликали це, тому що це працює. Чому це краще, ніж інші відповіді?
— Бентфорд,

1
Чому parentViewController? Навіть якщо вигляд знаходиться на вкладці перегляду навігації, BarController все одно повинен вказувати на потрібне місце. У будь-якому випадку працює для мене без parentViewController.
— Натан

11
Інша відповідь здається потенційно кращою. Шукайте [actionSheet showInView: [вікно самостійного перегляду]]. Здається більш прямим вперед і більш загальним.
— Кевін

Дуже дякую за публікацію цієї відповіді.
— фульвіо

1
У моєму додатку немає панелі вкладок, але все ще є така проблема. Я вирішив це за допомогою "[serf.view window]". Це все-таки не проблема барної смуги.
— Майк Кескінов

37

Я знайшов відповідь в протягом тут , що працює.

використовуючи [filterActionSheet showInView:[self.view window]]:;

Я спробував декілька способів дістатися до моєї панелі вкладок, і вони налаштували це додаток, здається, перекрученим ...


ЗДОРОВИЙ! Дякую. Це правильне рішення для мене, оскільки я мав цю проблему з UITableViewController, який мав панель інструментів, а не TabBar, як інші.
— Вільям Денніс

хороший матеріал, це працювало для мене! це, безумовно, найпростіший спосіб зробити це!
— cgossain

2
Це спричиняє ще одну проблему. ActionSheet з’являється в портретному орієнтації, коли пристрої в альбомі (як і весь інший контент).
— Майк Кескінов

22

Замість цього використовуйте:

[sheet showFromTabBar:theTabBar];

1
Я виправив це з showInTabBar:до showFromTabBar:. Також зауважте, що існує метод "showFromToolbar:", залежно від того, яку меблі екрану ви маєте внизу екрана. Думаю, це краща відповідь, ніж прийнята відповідь.
— Стівен Дарлінгтон

Стівен, цікаво, чому ви вважаєте, що це краще, ніж вказувати showInView: theTabBar? З точки зору з’єднання, я думаю, що showInView, ймовірно, буде більш ідеальним, якщо пізніше піктограма tabBar випаде, можливо, заміниться, наприклад, на панелі інструментів. Думаю, конкретний контролер підпрозору насправді не повинен знати чи піклуватися.
— Біллі Грей

Якщо пізніше панель вкладок буде відпущена, вам доведеться редагувати цей рядок коду незалежно (якщо, можливо, TheTabBar - це погано названа посилання на поданий перегляд). Тому я не бачу, як цей метод є більш сполученим, ніж showInView: theTabBar. Я використовую showFromTabBar: також, як це мені здається безпечнішим. Я не знаю, що відбувається під обкладинками, але я думаю, що showFromTabBar: менше шансів зламатись у майбутніх випусках ОС, ніж showFromView: з видом панелі вкладок.
— Крістофер Пікслі

10

Ось виправлення. Спробуйте це:

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

5

Я думаю, що комбінація трьох відповідей - це правильний спосіб вирішення цього питання:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

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


Звичайно, він повертає нуль, тому що батьківський контролер подання (який є UITabBarViewController) не вкладається в інший UITabBarController, тому його властивість tabBarController є нульовою.
— Домінік Сейбольд

1

FYI - мала таку ж проблему з таблицею дій UIDocumentInteractionController, переходячи на панель вкладок. Для виправлення використовуйте наступне.

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

-2

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

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

ця робота чудово

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.