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
}