iPad UIActionSheet нажмите снаружи, чтобы закрыть - состояние UIActionSheet?

Я использую ShareKit SHKActionSheet (на основе UIActionSheet) для приложения на iPad:

SHKItem *item = [SHKItem URL:url title:@""];
actionSheet = [SHKActionSheet actionSheetForItem:item];
[actionSheet showFromToolbar:self.navigationController.toolbar];

Я хочу выполнить какое-то действие в зависимости от того, отображается actionSheet или нет. Проблема в том, что когда пользователь нажимает за пределами actionSheet, чтобы закрыть его из представления (поведение по умолчанию на iPad), actionSheet больше не указывает на действительный SHKActionSheet и не имеет значения nil. Как я могу пройти тест на такое увольнение?


person camden_kid    schedule 08.03.2012    source источник


Ответы (1)


Класс UIActionSheet имеет свойство visible. Это возвращает YES, если отображается лист действий, NO, если нет. Это должно позволить вам узнать, отклонено ли оно.

Вы также можете реализовать некоторые UIActionSheetDelegate методы, чтобы знать, когда оно было отклонено или отменено, используя actionSheetCancel: и / или actionSheet:didDismissWithButtonIndex:.

РЕДАКТИРОВАТЬ:

Чтобы обязательно получать вызовы делегатов вашего UIActionSheet, обязательно укажите в объявлении интерфейса вашего контроллера (.h):

@interface YourViewController : UIViewController<UIActionSheetDelegate>

@end

Затем в реализации контроллера (.m):

- (void)actionSheetCancel:(UIActionSheet *)actionSheet {

    NSLog(@"action sheet is about to be cancelled");
}

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"action sheet was dismissed");
}

ИЗМЕНИТЬ 2:

Я только что взглянул на код класса SHKActionSheet, и оказалось, что он не реализует метод actionSheetCancel:, поэтому вы его не получаете. Однако он реализует метод actionSheet:didDismissWithButtonIndex::

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
{
    // Sharers
    if (buttonIndex >= 0 && buttonIndex < sharers.count)
    {
        [NSClassFromString([sharers objectAtIndex:buttonIndex]) performSelector:@selector(shareItem:) withObject:item];
    }

    // More
    else if (buttonIndex == sharers.count)
    {
        SHKShareMenu *shareMenu = [[SHKCustomShareMenu alloc] initWithStyle:UITableViewStyleGrouped];
        shareMenu.item = item;
        [[SHK currentHelper] showViewController:shareMenu];
        [shareMenu release];
    }

    [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
} 

Если вы хотите получать уведомления о методе actionSheetCancel:, просто добавьте его в файл SHKActionSheet.m:

- (void)actionSheetCancel:(UIActionSheet *)actionSheet {

    [super actionSheetCancel:actionSheet];
}

Тогда метод делегата в вашем контроллере будет вызываться правильно :)

Справочник по классу UIActionSheet

person Mutix    schedule 08.03.2012
comment
Проблема в том, что приложение вылетает, когда я тестирую actionSheet.visible после его закрытия. - person camden_kid; 08.03.2012
comment
Хорошо, в этом случае попробуйте реализовать упомянутые мной методы делегата. Убедитесь, что вы установили свойство делегата листа действий: actionSheet.delegate = self; - person Mutix; 08.03.2012
comment
В своей настройке я делаю следующее: SHKActionSheet * as = [[SHKActionSheet alloc] initWithTitle: SHKLocalizedString (@Share) делегат: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil]; но строка делегата предупреждает меня о том, что self не относится к типу UIActionSheetDelegate. Думаю, это мешает мне назначать делегатов. - person camden_kid; 08.03.2012
comment
Хорошо, я отредактировал свой ответ, чтобы показать, как использовать методы делегата - person Mutix; 08.03.2012
comment
Спасибо за вашу помощь. Я не заставил этих делегатов работать. Однако это заставило меня поместить NSlog в dismissWithClickedButtonIndex, который на самом деле вызывается после dimiss (часть ClickedButton вводила в заблуждение). - person camden_kid; 08.03.2012
comment
Пожалуйста. Я снова отредактировал на случай, если вы предпочтете использовать метод actionSheetCancel: вместо метода dismissWithClickedButtonIndex:. - person Mutix; 08.03.2012