#iphone #ios #uiview #uidatepicker #uiactionsheet
#iPhone #iOS #uiview #uidatepicker #uiactionsheet
Вопрос:
У меня есть UIActionSheet, чтобы выбрать время для использования в моем приложении. Выбор времени работает нормально, но я не могу найти способ скрыть таблицу действий при нажатии кнопки «Готово».
Код, который у меня есть, является:
-(void) showTimespanPicker{
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Preparation Time", "Preparation Time")
delegate:self cancelButtonTitle:nil//@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
actionSheet.tag = PREPTIME_PICKER;
CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
prepTimePicker = [[UIDatePicker alloc] initWithFrame:pickerFrame];
prepTimePicker.datePickerMode = UIDatePickerModeCountDownTimer;
prepTimePicker.countDownDuration = (NSTimeInterval )[recipe.prepTime doubleValue];
[actionSheet addSubview:prepTimePicker];
[prepTimePicker release];
// create toolbar with "Done" button
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(prepTimeSelected)];
NSArray *barButtons = [NSArray arrayWithObject:barButtonItem];
[toolbar setItems:barButtons];
[actionSheet addSubview:toolbar];
MyAppAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[actionSheet showInView:delegate.window];
[actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
}
// fires when the done button is clicked
-(void)prepTimeSelected {
recipe.prepTime = (NSInteger)prepTimePicker.countDownDuration;
[self updatePickerValues];
[[prepTimePicker.superview].setHidden:YES];
}
Последняя строка в prepTimeSelected скрывает UIDatePicker, но не actionsheet. Я думаю, мне нужен какой-то рекурсивный способ поиска родительского элемента кнопки, либо это, либо создать переменную класса / свойство для ActionSheet, но этот способ кажется неправильным.
Ответ №1:
UIActionSheet *menuProperty;
@property(nonatomic,retain) UIActionSheet *menuArea;
Затем вам необходимо внести следующие изменения в ваш файл .m
menuArea = [[UIActionSheet alloc] initWithTitle:nil delegate:self
cancelButtonTitle:@"Done"
destructiveButtonTitle:nil
otherButtonTitles:nil];
// Add the picker
pickerArea = [[UIPickerView alloc] initWithFrame:CGRectMake(0,185,0,0)];
pickerArea.delegate = self;
pickerArea.showsSelectionIndicator = YES; // note this is default to NO
[menuArea addSubview:pickerArea];
[menuArea showInView:self.view];
[menuArea setBounds:CGRectMake(0,0,320, 600)];
Комментарии:
1. Я понимаю, что могу это сделать, я спрашивал способ сделать это без добавления свойства для actionsheet.
Ответ №2:
UIView *aView = prepTimePicker;
do {
aView = aView.superView;
} while ((aView != nil) amp;amp; [aView isMemberOfClass:[UIActionSheet class]]);
[aView dismissWithClickedButtonIndex:0 animated:YES];
Это должно помочь вам найти UIActionSheet
объект.
Ответ №3:
[[ [[[UIApplication sharedApplication] delegate] window]
viewWithTag: PREPTIME_PICKER] dismissWithClickedButtonIndex:0 animated:YES];
Это не сработало?
Комментарии:
1. Нет, в ActionSheet нет кнопки «отклонить», поэтому я попробовал [[[[[UIApplication sharedApplication] делегировать] window] viewWithTag: PREPTIME_PICKER] resignFirstResponder]; Но это не дало никакого эффекта.