Сбой iPad с UIActionSheet, отображаемым из контроллера дочернего представления - PullRequest
3 голосов
/ 06 декабря 2011

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

У меня есть приложение xibless, основанное на UINavigationController. Некоторые из моих дочерних ViewControllers имеют кнопку справа вверху, которая затем отображает UIActionSheet. Мое приложение предназначено для iPhone и iPad, поэтому, когда я готов отображать таблицу UIActionSheet, я делаю:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:@"%@ Menu", [self title]] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Email", @"Print", nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleDefault];
if ([actionSheet respondsToSelector:@selector(showFromBarButtonItem:animated:)])
    [actionSheet showFromBarButtonItem:[[self navigationItem] rightBarButtonItem] animated:YES];
else [actionSheet showInView:[self view]];
[actionSheet release];

На iPad я пытаюсь показать UIActionSheet, прикрепленный к правой кнопке панели, а на iPhone он должен скользить снизу. Все это прекрасно работает.

К сожалению, если вы нажмете кнопку и отобразите меню на iPad, но затем нажмете кнопку «Назад» в верхней левой части приложения, меню не исчезнет. Вместо этого UINavigationController покорно возвращается, и UIActionSheet все еще там. Если вы попытаетесь нажать что-то в меню, вы, конечно, получите сбой. Если бы пользователь нажал что-нибудь еще на экране вместо кнопки «Назад», меню корректно закрывается.

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

В моем демонстрационном проекте есть AppDelegate и ViewController, и это все. AppDelegate создает NSDictionary из NSDictionaries, так что у меня есть модель, которую я могу использовать для демонстрации проблемы. ViewController показывает все ключи словаря, и если соответствующее значение является NSDictionary, вы можете нажать его, чтобы развернуть.

Ответы [ 2 ]

7 голосов
/ 06 декабря 2011

Это интересная проблема. Вот что говорит ссылка на класс UIActionSheet .

На iPad этот метод представляет лист действий в всплывающем окне и добавляет панель инструментов, которой принадлежит кнопка в списке проходов поповера Просмотры. Таким образом, нажатие на панели инструментов приводит к действиям метода соответствующие элементы панели инструментов, вызываемые. Если вы хотите, чтобы поповер быть отклоненным при нажатии на другой элемент панели инструментов, вы должны реализовать это поведение в ваших методах обработчика действий.

Поэтому, когда вы отображаете лист действий, он автоматически создает UIPopoverController и устанавливает содержащую его панель инструментов (или панель навигации) в качестве сквозных представлений всплывающего окна, позволяя сенсорным событиям продолжаться. Я думаю, что лучше всего создать переменную экземпляра для вашего листа действий и заставить ее отклониться, если она видна в -viewWillDisappear:.

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (self.actionSheet.window) // If action sheet is on screen, window is non-nil
        [self.actionSheet dismissWithClickedButtonIndex:self.actionSheet.cancelButtonIndex animated:animated];
}
0 голосов
/ 06 декабря 2011

Вы пытались принудительно закрыть ActionSheet на viewWillDisappear?

Попробуйте это:

// In MyViewController.m

    - (void)viewWillDisappear:(BOOL)animated {

        [actionSheet dismissWithClickedButtonIndex:nil animated:animated];

    }

* Сбой звучит как возможный EXC_BAD_ACCESS.Возможно, вы теряете ссылку на указатель на «actionSheet», когда вы меняете представления из-за вашего выпуска.Может быть, стоит придерживаться ссылки на actionSheet в вашем файле .h и управлять сроками выпуска.

* Также см. Документацию для получения информации о сообщении о прекращении: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIActionSheet_Class/Reference/Reference.html

...