Лист uiAction не отключается при нажатии UIBarButton

#iphone #objective-c #cocoa-touch #uiactionsheet

#iPhone #objective-c #cocoa-touch #UIActionSheet

Вопрос:

Я представляю UIActionSheet из UIBarButtonItem. Я хочу, чтобы лист действий закрывался при повторном нажатии кнопки bar, вместо этого он создает новый каждый раз, когда накладывается друг на друга. Есть идеи?

 - (IBAction)actionButtonClicked:(id)sender
{
    UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:@"Action Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Help", @"Lock", nil];
    popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    [popupQuery showFromBarButtonItem:sender animated:YES];
    [popupQuery release];
}

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

Ответ №1:

Я бы объявил @property for popupQuery в своем классе и использовал его для отслеживания таблицы действий.

 - (IBAction)actionButtonClicked:(id)sender
{
    // If self.popupQuery is not nil, it means the sheet is on screen and should be dismissed. The property is then set to nil so a new sheet can be created next time.
    if (self.popupQuery)
    {
        [self.popupQuery dismissWithClickedButtonIndex:self.popupQuery.cancelButtonIndex animated:YES];
        self.popupQuery = nil;

        return;
    }

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Action Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Help", @"Lock", nil];
    sheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    sheet.delegate = self;
    self.popupQuery = sheet;
    [sheet release];

    [self.popupQuery showFromBarButtonItem:sender animated:YES];  
}

// Implementing this method to be notified of when an action sheet dismisses by means other than tapping the UIBarButtonItem. We set the property to nil to prepare for lazy instantiation next time.
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    self.popupQuery = nil;
}
  

Комментарии:

1. Это работает, но теперь у меня другая проблема. Если я нажму кнопку, чтобы отобразить всплывающее окно, и я отклоню его, щелкнув в любом месте экрана, если я снова нажму кнопку, чтобы отобразить всплывающее окно, я должен щелкнуть его дважды, чтобы оно появилось. Однако, если я отклоню его изначально, просто нажав кнопку еще раз, в следующий раз, когда я ее нажму, мне нужно нажать ее только один раз, поскольку она работает нормально.

2. Обновил мой ответ. Суть в том, чтобы сделать себя делегатом листа действий и реализовать -actionSheet:didDismissWithButtonIndex: уведомление о том, что лист действий был отклонен с помощью средств, отличных от кнопки bar.

3. почему бы не выделить лист действий один раз, проверить, виден ли он в функции actionButtonClicked, и если да, то отклонить его, иначе показать его?