UIActionSheet iPad, показывающий несколько раз - PullRequest
10 голосов
/ 27 марта 2011

У меня есть метод с именем -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!

Ответы [ 5 ]

33 голосов
/ 23 апреля 2011

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

В вашем классе, в котором есть showMoreTools, в заголовке укажите:

@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;
}
1 голос
/ 22 марта 2013

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

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

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

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

0 голосов
/ 23 августа 2014

Мой метод аналогичен методу Кристоферкоттона.

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

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

    //actionsheet code
}
0 голосов
/ 06 апреля 2011

попробуйте установить флаг (ДА / НЕТ)

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
0 голосов
/ 27 марта 2011

использование

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