ios uipickerview uiactionsheet uialertcontroller actionsheetpicker

Mostrar un UIPickerView con UIActionSheet en iOS8 no funciona



uialertcontroller actionsheetpicker (8)

De la referencia para UIActionSheet:

UIActionSheet no está diseñado para ser subclasificado, ni debe agregar vistas a su jerarquía. Si necesita presentar una hoja con más personalización que la que proporciona la API UIActionSheet, puede crear la suya propia y presentarla de manera modal con presentViewController: animated: completion :.

Mi suposición es que veas exactamente por qué.

La referencia para UIAlertController no tiene un descargo de responsabilidad similar, pero mirando su interfaz, supongo que Apple lo agregará antes del lanzamiento.

Mi recomendación sería crear una vista pequeña que contenga el selector y los botones y mostrarla y ocultarla según sea necesario. No es tan difícil de hacer y no empuja las interfaces más allá de sus usos previstos.

Mostrar un UIPickerView con UIActionSheet en iOS8 no funciona

El código funciona en iOS7 , sin embargo, no funciona en iOS8 . Estoy seguro de que es porque UIActionSheet está en desuso en iOS8 y Apple recomienda usar UIAlertController .

Sin embargo, ¿cómo hacerlo en iOS8 ? Debería usar UIAlertController ?

iOS7 :

iOS8 :

EDITAR:

Mi proyecto GitHub soluciona el problema.


Escribo el selector de tiempo solo en lugar de UIActionSheet en iOS8:

date = [NSDate date]; timePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 44, 0, 0)]; timePicker.datePickerMode = UIDatePickerModeDateAndTime; timePicker.hidden = NO; timePicker.date = date; displayFormatter = [[NSDateFormatter alloc] init]; [displayFormatter setTimeZone:[NSTimeZone localTimeZone]]; [displayFormatter setDateFormat:@"MM月dd日 EEE HH:mm"]; formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone localTimeZone]]; [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; startDisplayTimeString = [displayFormatter stringFromDate:timePicker.date]; startTimeString = [formatter stringFromDate:timePicker.date]; NSTimeInterval interval = 24*60*60*1; NSDate *endDate = [[NSDate alloc] initWithTimeIntervalSinceNow:interval]; endDisplayTimeString = [displayFormatter stringFromDate:endDate]; endTimeString = [formatter stringFromDate:endDate]; [_startTimeLabel setText:startDisplayTimeString]; [_endTimeLabel setText:endDisplayTimeString]; [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; NSDateFormatter *dateFormatter =[[NSDateFormatter alloc] init]; [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 64)]; pickerToolbar.tintColor = [UIColor whiteColor]; [pickerToolbar sizeToFit]; UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelBtnPressed:)]; [cancelBtn setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor colorWithRed:253.0/255.0 green:68.0/255.0 blue:142.0/255.0 alpha:1.0], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *titleButton; float pickerMarginHeight = 168; titleButton = [[UIBarButtonItem alloc] initWithTitle:@"title" style:UIBarButtonItemStylePlain target: nil action: nil]; [titleButton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor colorWithRed:253.0/255.0 green:68.0/255.0 blue:142.0/255.0 alpha:1.0], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithTitle:@"OK" style:UIBarButtonItemStyleDone target:self action:@selector(setTimePicker)]; [doneBtn setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor colorWithRed:253.0/255.0 green:68.0/255.0 blue:142.0/255.0 alpha:1.0], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; NSArray *itemArray = [[NSArray alloc] initWithObjects:cancelBtn, flexSpace, titleButton, flexSpace, doneBtn, nil]; [pickerToolbar setItems:itemArray animated:YES]; if(iPad){ [pickerToolbar setFrame:CGRectMake(0, 0, 320, 44)]; UIViewController* popoverContent = [[UIViewController alloc] init]; popoverContent.preferredContentSize = CGSizeMake(320, 216); UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 216)]; popoverView.backgroundColor = [UIColor whiteColor]; [popoverView addSubview:timePicker]; [popoverView addSubview:pickerToolbar]; popoverContent.view = popoverView; popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent]; [popoverController presentPopoverFromRect:CGRectMake(0, pickerMarginHeight, 320, 216) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; }else{ timeBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-300, 320, 246)]; [timeBackgroundView setBackgroundColor:[UIColor colorWithRed:240/255.0 green:240/255.0 blue:240/255.0 alpha:1.0]]; [timeBackgroundView addSubview:pickerToolbar]; [timeBackgroundView addSubview:timePicker]; [self.view addSubview:timeBackgroundView];}


He enfrentado el mismo problema y lo resolvió de esta manera, funcionará en todas las versiones de ios

En ios 8 apple ha cambiado tantas cosas que aquí he enfrentado un problema en mi propio proyecto, así que solo quiero ofrecer la solución en reemplazo de UIActionsheet .

en ios 8 UIActionsheet obsoleto y sus métodos de delegado también se desaprobaron. En lugar de ese UIAlertController con UIAlertController
Se utiliza UIAlertControllerStyleActionSheet . puedes verificar este hilo también:

https://developer.apple.com/library/ios/documentation/Uikit/reference/UIActionSheet_Class/index.html

Este ejemplo funcionará tanto en ios 8 como en la versión anterior de este.

en el archivo .h declara esta variable

@interface demoProfileForBuyer{ UIActionSheet *ac_sheet_fordate; UIToolbar *pickerToolBar_fordate; UIDatePicker *optionPickerDate; UIAlertController *alertController; }

en archivo .m

- (void)viewDidLoad { [super viewDidLoad]; pickerToolBar_fordate = [[UIToolbar alloc] initWithFrame:CGRectMake(-8, 0, 320, 44)]; pickerToolBar_fordate.barStyle = UIBarStyleBlack; [pickerToolBar_fordate sizeToFit]; NSMutableArray *barItemsDate = [[NSMutableArray allkioc] init]; UIBarButtonItem *flexSpaceDate = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; [barItemsDate addObject:flexSpaceDate]; UIBarButtonItem *doneBtnDate = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerViewDoneBirthday)]; [barItemsDate addObject:doneBtnDate]; [pickerToolBar_fordate setItems:barItemsDate animated:YES]; optionPickerDate = [[UIDatePicker alloc] initWithFrame:CGRectMake(-8, 44, 320, 200)]; optionPickerDate.datePickerMode = UIDatePickerModeDate; [optionPickerDate setMaximumDate: [NSDate date]]; optionPickerDate.datePickerMode = UIDatePickerModeDate; optionPickerDate.hidden = NO; optionPickerDate.date = [NSDate date]; optionPickerDate.backgroundColor = [UIColor whiteColor]; if(IS_IOS_8){ alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:alertAction]; [alertController addAction:alertAction]; [alertController addAction:alertAction]; [alertController addAction:alertAction]; [alertController.view addSubview:pickerToolBar_fordate]; [alertController.view addSubview:optionPickerDate]; } else { ac_sheet_fordate = [[UIActionSheet alloc] initWithTitle:@"test" delegate:self cancelButtonTitle:@"cancel" destructiveButtonTitle:nil otherButtonTitles:@"dev",@"dev", nil]; [ac_sheet_fordate setActionSheetStyle:UIActionSheetStyleBlackOpaque]; [ac_sheet_fordate setBackgroundColor:[UIColor blackColor]]; [ac_sheet_fordate addSubview:pickerToolBar_fordate]; [ac_sheet_fordate addSubview:optionPickerDate]; } } // when date picker open - (IBAction)showBirthdayPicker:(id)sender{ // self.view.frame = CGRectMake(0, -220, self.view.frame.size.width, self.view.frame.size.height); UIButton *btnsender = sender; //[ac_sheet_fordate showInView:self.view]; self.scrForEditProfile.contentSize = CGSizeMake(320, 1000); if(IS_IOS_8){ popover = alertController.popoverPresentationController; if (popover) { popover.sourceView = sender; popover.sourceRect = CGRectMake(0, btnsender.bounds.origin.y, btnsender.bounds.size.width, btnsender.bounds.size.height); popover.permittedArrowDirections = UIPopoverArrowDirectionAny; } [self presentViewController:alertController animated:YES completion:nil]; } else { if(IS_IOS_7){ [ac_sheet_fordate showInView:[UIApplication sharedApplication].keyWindow]; ac_sheet_fordate.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height-ac_sheet_fordate.frame.size.height, [UIScreen mainScreen].bounds.size.width, ac_sheet_fordate.frame.size.height); } else{ [ac_sheet_fordate showInView:self.view]; } } if(IS_IOS_7==FALSE && IS_HEIGHT_GTE_568==FALSE){ [self.scrForEditProfile scrollRectToVisible:CGRectMake(self.txtDOB.frame.origin.x, self.txtDOB.frame.origin.y + 200, self.txtDOB.frame.size.width, self.txtDOB.frame.size.height) animated:NO]; } else{ [self.scrForEditProfile scrollRectToVisible:CGRectMake(self.txtDOB.frame.origin.x, self.txtDOB.frame.origin.y +300, self.txtDOB.frame.size.width, self.txtDOB.frame.size.height) animated:NO]; } } // when date picker open user tap on done button - (IBAction)pickerViewDoneBirthday{ if(IS_IOS_8){ [self.presentedViewController dismissViewControllerAnimated:NO completion:nil]; } else { [ac_sheet_fordate dismissWithClickedButtonIndex:0 animated:YES]; } NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"dd/MM/yyyy"]; birthday_date = optionPickerDate.date; [self.btnShowDatePicker setTitle:[formatter stringFromDate:optionPickerDate.date] forState:UIControlStateNormal]; [self.btnShowDatePicker setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [self.btnShowDatePicker setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; self.scrForEditProfile.contentSize=CGSizeMake(320 , 700); [self.scrForEditProfile scrollsToTop]; }

también puedes consultar mi blog, http://ioscodesample.blogspot.in/2014/10/ios-8-changes-for-actionsheet.html

Gracias.


Intenta usar esta simulación de hoja de acción:

@interface UIViewController (ActionSheetSimulation) -(UIView*) actionSheetSimulationWithPickerView:(UIPickerView*)pickerView withToolbar: (UIToolbar*)pickerToolbar; -(void)dismissActionSheetSimulation:(UIView*)actionSheetSimulation; @end #import "UIViewController+ActionSheetSimulation.h" @implementation UIViewController (ActionSheetSimulation) -(UIView *)actionSheetSimulationWithPickerView:(UIPickerView *)pickerView withToolbar:(UIToolbar *)pickerToolbar { UIView* simulatedActionSheetView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)]; [simulatedActionSheetView setBackgroundColor:[UIColor clearColor]]; CGFloat pickerViewYpositionHidden = UIScreen.mainScreen.bounds.size.height + pickerToolbar.frame.size.height; CGFloat pickerViewYposition = UIScreen.mainScreen.bounds.size.height - pickerView.frame.size.height + UIApplication.sharedApplication.statusBarFrame.size.height; [pickerView setFrame:CGRectMake(pickerView.frame.origin.x, pickerViewYpositionHidden, pickerView.frame.size.width, pickerView.frame.size.height)]; [pickerToolbar setFrame:CGRectMake(pickerToolbar.frame.origin.x, pickerViewYpositionHidden, pickerToolbar.frame.size.width, pickerToolbar.frame.size.height)]; pickerView.backgroundColor = [UIColor whiteColor]; [simulatedActionSheetView addSubview:pickerToolbar]; [simulatedActionSheetView addSubview:pickerView]; [UIApplication.sharedApplication.keyWindow?UIApplication.sharedApplication.keyWindow:UIApplication.sharedApplication.windows[0] addSubview:simulatedActionSheetView]; [simulatedActionSheetView.superview bringSubviewToFront:simulatedActionSheetView]; [UIView animateWithDuration:0.25f animations:^{ [simulatedActionSheetView setBackgroundColor:[[UIColor darkGrayColor] colorWithAlphaComponent:0.5]]; [self.view setTintAdjustmentMode:UIViewTintAdjustmentModeDimmed]; [self.navigationController.navigationBar setTintAdjustmentMode:UIViewTintAdjustmentModeDimmed]; [pickerView setFrame:CGRectMake(pickerView.frame.origin.x, pickerViewYposition, pickerView.frame.size.width, pickerView.frame.size.height)]; [pickerToolbar setFrame:CGRectMake(pickerToolbar.frame.origin.x, pickerViewYposition, pickerToolbar.frame.size.width, pickerToolbar.frame.size.height)]; } completion:nil]; return simulatedActionSheetView; } -(void)dismissActionSheetSimulation:(UIView*)actionSheetSimulation { [UIView animateWithDuration:0.25f animations:^{ [actionSheetSimulation setBackgroundColor:[UIColor clearColor]]; [self.view setTintAdjustmentMode:UIViewTintAdjustmentModeNormal]; [self.navigationController.navigationBar setTintAdjustmentMode:UIViewTintAdjustmentModeNormal]; [actionSheetSimulation.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { UIView* v = (UIView*)obj; [v setFrame:CGRectMake(v.frame.origin.x, UIScreen.mainScreen.bounds.size.height, v.frame.size.width, v.frame.size.height)]; }]; } completion:^(BOOL finished) { [actionSheetSimulation removeFromSuperview]; }]; } @end


Mira mi código

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"/n/n/n/n/n/n/n/n/n/n/n" preferredStyle:UIAlertControllerStyleActionSheet]; __weak typeof(self) weakSelf = self; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确认"style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { [weakSelf pickActionSheetFinishAction]; [alertController addAction:cancelAction]; [alertController.view addSubview:self.topicPickView]; [self presentViewController:alertController animated:YES completion:nil];


Para lograr el mismo efecto visual, puede usar ActionSheetPicker-3.0 , que funciona con iOS 8 .

En realidad, ya no es UIActionSheet . Pero se ve exactamente igual, y es por eso que funciona en iOS 8 .


Tengo el mismo problema contigo, mostrar un UIPickerView con UIActionSheet no funciona en iOS 8. Debido a que UIActionSheet está en desuso y Apple recomienda usar UIAlertController. Entonces deberíamos redondear al viento.

Escribí un código para resolver mi caso. Espero que pueda ayudarte.

#define CONTENT_HEIGHT 478 - (void)initSheetWithWidth:(CGFloat)aWidth { if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { UIAlertController *sheet = [UIAlertController alertControllerWithTitle:@"hack space" message:@"/n/n/n/n/n/n/n/n/n/n/n" preferredStyle:UIAlertControllerStyleActionSheet]; [sheet.view setBounds:CGRectMake(7, 0, aWidth, CONTENT_HEIGHT)]; // Kinda hacky self.sheet = sheet; } else { UIActionSheet *sheet = [[UIActionSheet alloc] init]; self.sheet = sheet; } UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, aWidth, CONTENT_HEIGHT)]; [view setBackgroundColor:[UIColor whiteColor]]; UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, aWidth, 0)]; toolbar.barStyle = UIBarStyleDefault; [toolbar sizeToFit]; [toolbar setItems:@[ [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerSheetCancel)], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerSheetDone)] ]]; UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, toolbar.bounds.size.height, aWidth, 0)]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { UIAlertController *sheet = self.sheet; [view addSubview:toolbar]; [view addSubview:picker]; [sheet.view addSubview:view]; } else { UIActionSheet *sheet = self.sheet; [sheet addSubview:toolbar]; [sheet addSubview:picker]; } self.picker = picker; } - (void)showWithDate:(NSDate*)date { if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { // Reload and select first item [self.picker setDate:date]; [self.parentViewController presentViewController:self.sheet animated:YES completion:nil]; } else { UIActionSheet *sheet = self.sheet; [self.sheet showInView:self.containerView]; // XXX: Kinda hacky, but seems to be the only way to make it display correctly. [self.sheet setBounds:CGRectMake(0, 0, self.containerView.frame.size.width, sheet.frame.size.height - CONTENT_HEIGHT)]; // Reload and select first item [self.picker setDate:date]; [UIView animateWithDuration:0.25 animations:^{ [self.sheet setBounds:CGRectMake(0, 0, self.containerView.frame.size.width, sheet.frame.size.height)]; }]; } }

Creo que es todo para solucionar este problema. Feliz codificación!


UIActionSheet está privado de iOS8 . Use UIAlertController para iOS8 o posterior

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert" message:@"This is an action shhet." preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction* cameraAction = [UIAlertAction actionWithTitle:@"Take A Photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; UIAlertAction* galleryAction = [UIAlertAction actionWithTitle:@"From Gallery" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; UIAlertAction * defaultAct = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {}]; [alert addAction:cameraAction]; [alert addAction:galleryAction]; [alert addAction:defaultAct]; [self presentViewController:alert animated:YES completion:nil];

Ref: UIAlertController

Ejemplo: https://github.com/KiritVaghela/UIAlertController