Увольнение UIActionSheet от UIBarButtonItem на iPad - PullRequest
6 голосов
/ 04 декабря 2011

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

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

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

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

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

1 Ответ

2 голосов
/ 04 декабря 2011

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

enter image description here

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

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

...