Увольнение UIActionSheet от UIBarButtonItem на iPad

У меня есть UIToolbar с несколькими UIBarButtonItemкоторые показывают различные UIActionSheetс помощью showFromBarButtonItem:,

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

Хотя есть одно исключение. Если я коснусь другого UIBarButtonItemэта кнопка срабатывает, и текущий лист действий НЕ удаляется с экрана. Если новая кнопка происходит, чтобы запустить другую UIActionSheetЯ получаю два (или более) листа действий на экране.

Конечно, я могу пройти через утомительный процесс запоминания того, что на экране, и отклонения этого вручную, но я также обеспокоен пользователем, поскольку некоторые касания (те, которые предназначены для кнопок панели инструментов) выполняются, а другие игнорируются.

Есть ли что-нибудь, что я могу сделать, или я должен жить в этой ситуации?

1 ответ

Решение

Это кажется досадным несоответствием, но не трудно исправить. В этом примере предполагается, что вам нужно только показать UIActionSheets Кажется, что это с тобой.

Вот пример того, как это исправить, начиная с .h:

@interface TestToolBarExclusiveActionSheet : UIViewController <UIActionSheetDelegate>{
    UIActionSheet *sheetShowing;
}
@property (weak, nonatomic) IBOutlet UIBarButtonItem *oneButton;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *twoButton;
@end

и .m:

#import "TestToolBarExclusiveActionSheet.h"
@implementation TestToolBarExclusiveActionSheet
@synthesize oneButton;
@synthesize twoButton;
-(IBAction)targetForBothButtons:(UIBarButtonItem *)button{
    if (sheetShowing != nil){
        [sheetShowing dismissWithClickedButtonIndex:[sheetShowing cancelButtonIndex] animated:YES];
        sheetShowing = nil;
    }
    else{ // I am free to act on the button push.
        // Just for demo.. So:
        sheetShowing = [[UIActionSheet alloc] initWithTitle:button.title delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Destroy" otherButtonTitles:nil, nil];
        [sheetShowing showFromBarButtonItem:button animated:YES];
    }
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    sheetShowing = nil;
    // Respond to action sheet like normal
}
-(void)viewDidUnload{
    [self setOneButton:nil];
    [self setTwoButton:nil];
    [super viewDidUnload];
}
@end

и, наконец, скриншот .xib (отображается в режиме iPhone для размера изображения):

Просто подключите выходы кнопок и подключите оба действия кнопок к targetForBothButtons: метод.

Вы увидите, что если отображается один из листов действий, то нажатие любой кнопки панели приведет к удалению листа действий.

Другие вопросы по тегам