IPad UIActionSheet показывает несколько раз

У меня есть метод -showMoreTools:

- (IBAction) showMoreTools:(id)sender {
    UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Close" otherButtonTitles:@"Add Bookmark", @"Add to Home Screen", @"Print", @"Share", nil];
    popupQuery.actionSheetStyle = UIActionSheetStyleDefault;
    popupQuery.dismiss
    [popupQuery showFromBarButtonItem:moreTools animated:YES];
    [popupQuery release];
}
Когда пользователь отбирает UIBarButtonItem, он отображает это UIActionSheet, но затем, если пользователь хочет закрыть UIActionSheet, не нажимая кнопку "Закрыть" (нажав UIBarButtonItem, затем отобразит UIActionSheet поверх сначала UIActionSheet.

Возможно ли каким-то образом нажимать UIBarButtonItem на следующий раз, чтобы закрыть UIActionSheet?

Большое вам спасибо - я новичок в программировании на iOS!

Ответ 1

Чтобы отменить его, когда вы дважды нажимаете кнопку, вам необходимо отслеживать отображение в данный момент ActionSheet. Мы делаем это в нашем iPad-приложении, и он отлично работает.

В вашем классе, который имеет showMoreTools, в заголовке put:

@interface YourClassHere : NSObject <UIActionSheetDelegate> {
      UIActionSheet* actionSheet_;  // add this line
}

В файле класса измените его на:

-(IBAction) showMoreTools:(id)sender {
    // currently displaying actionsheet?
    if (actionSheet_) {
        [actionSheet_ dismissWithClickedButtonIndex:-1 animated:YES];
        actionSheet_ = nil;
        return;
    }

    actionSheet_ = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Close" otherButtonTitles:@"Add Bookmark", @"Add to Home Screen", @"Print", @"Share", nil];
    actionSheet_.actionSheetStyle = UIActionSheetStyleDefault;
    [popupQuery showFromBarButtonItem:moreTools animated:YES];
    [actionSheet_ release];  // yes, release it. we don't retain it and don't need to
}


- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    // just set to nil
    actionSheet_ = nil;
}

Ответ 2

Я нашел другое решение. Проблема заключается в том, что при использовании showFromBarButtonItem представление панели инструментов автоматически добавляется в список popover переходов. Вы можете изменять (и очищать) представления представлений при использовании UIPopoverController напрямую, но не тогда, когда оно представлено как часть UIActionSheet.

В любом случае, используя showFromRect, нет панели инструментов, которую popover может автоматически добавить в свои прокси-представления. Поэтому, если вы знаете прямоугольник (приблизительный), где находится панель кнопок, вы можете использовать что-то вроде:

CGRect buttonRect = CGRectIntersection(toolbar.frame, CGRectMake(0, 0, 60, self.frame.size.height));
[popupQuery showFromRect:buttonRect inView:self animated:YES];

В приведенном выше примере моя кнопка находится в левой части панели инструментов.

Ответ 3

использовать

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated

Ответ 4

попробуйте установить флаг (YES/NO)

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated

Ответ 5

Мой метод похож на christophercotton's.

В моем showActionSheet я проверяю, отображается ли таблица действий, а не экземпляр:

- (IBAction)showActionSheet:(id)sender
{
    if ([self.fullActionSheet isVisible]) {
        [self.fullActionSheet dismissWithClickedButtonIndex:-1 animated:NO];
        _fullActionSheet = nil;
        return;
    }

    //actionsheet code
}