Кнопка скасування 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.