Уволить UIActionSheet от AppDelegate - PullRequest
       8

Уволить UIActionSheet от AppDelegate

1 голос
/ 21 октября 2011

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

Метод в моем делегате:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"STATUS - Application did become active");
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    [_notActiveTimer invalidate];
    _notActiveTimer = nil;

    [[NSNotificationCenter defaultCenter] postNotificationName:@"_application_background" object:self userInfo:NULL];

    LockScreen *vc = [[[LockScreen alloc] initWithNibName:@"LockScreen" bundle:nil] autorelease];
    vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    vc.showFullUsernamePasswordLogin = TRUE;
    [self.splitView presentModalViewController:vc animated: YES];
}

Код:

- (IBAction)showeRXActionSheet:(id)sender
{
    if (self.actionSheet != nil) {
        [self.actionSheet dismissWithClickedButtonIndex:0 animated:NO];
    }

    if (!self.eRXActionSheet)
    {
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"eRX Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"New eRX", @"eRX Refills", nil];
        sheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
        self.eRXActionSheet = sheet;
        [sheet release];

        [self.eRXActionSheet showFromBarButtonItem:sender animated:YES];

        return;
    }

    [self.eRXActionSheet dismissWithClickedButtonIndex:self.eRXActionSheet.cancelButtonIndex animated:YES];
    self.eRXActionSheet = nil;
}

- (IBAction)actionButtonClicked:(id)sender
{
    if (self.eRXActionSheet != nil) {
        [self.eRXActionSheet dismissWithClickedButtonIndex:0 animated:NO];
    }

    if (!self.actionSheet)
    {
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Action Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Help", @"Lock", @"Log Out", nil];
        sheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
        self.actionSheet = sheet;
        [sheet release];

        [self.actionSheet showFromBarButtonItem:sender animated:YES];

        return;
    }

    [self.actionSheet dismissWithClickedButtonIndex:self.actionSheet.cancelButtonIndex animated:YES];
    self.actionSheet = nil;
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (actionSheet == self.eRXActionSheet)
    {
        if (buttonIndex == 0)
        {
            [self erxButtonClicked];
        }
        else if (buttonIndex == 1)
        {
            [self erxRefillButtonClicked];
        }
    }
    else
    {
        if (buttonIndex == 0)
        {
            [self helpButtonClicked];
        }
        else if (buttonIndex == 1)
        {
            [self lockButtonClicked];
        }
        else if (buttonIndex == 2)
        {
            [self logOut];
        }
    }
}

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    self.eRXActionSheet = nil;
    self.actionSheet = nil;
}

1 Ответ

1 голос
/ 21 октября 2011

Это должно делать то, что вы хотите.

-(void)dismissSheet{
    if (self.actionSheet){
        [self.actionSheet dismissWithClickedButtonIndex:0 animated:NO];
    }
}

-(void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissSheet) name:UIApplicationWillResignActiveNotification object:nil];
        // Your other setup code
}

Вы также можете использовать UIApplicationDidEnterBackgroundNotification, что всегда имеет смысл для вашего потока приложений.

не забудьте удалить наблюдателя из dealloc.

...