Увольнение 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:
метод.
Вы увидите, что если отображается один из листов действий, то нажатие любой кнопки панели приведет к удалению листа действий.