在iOS8中显示与UIActionSheet UIPickerView不起作用

iOS8中显示与UIActionSheet UIPickerView不起作用

该代码适用于iOS7 ,但它不适用于iOS8 。 我确定这是因为UIActionSheet在iOS8中被弃用,Applebuild议使用UIAlertController

但是,如何在iOS8中做到这一点 ? 我应该使用UIAlertController

iOS7
在这里输入图像说明

iOS8
在这里输入图像说明

编辑:

我的GitHub项目解决了这个问题。

从UIActionSheet的参考:

UIActionSheet不是被devise为子类,也不应该添加视图到它的层次结构中。 如果您需要提供比UIActionSheet API提供的更多定制的工作表,您可以创build自己的模型并使用presentViewController呈现它:animated:completion :.

我的猜测是你看到了为什么。

UIAlertController的参考没有类似的免责声明,但看着它的界面,我猜测是苹果将在发布之前添加它。

我的build议是只创build一个包含你的select器和button的小视图,并根据需要显示和隐藏它。 这并不难,而且你的界面超出了他们的预期用途。

为了达到相同的视觉效果,你可以使用ActionSheetPicker-3.0 ,它适用于iOS 8

其实,这不是UIActionSheet了。 但看起来完全一样,这就是为什么它在iOS 8上工作

动画

UIActionSheet在iOS8中删除 。 对于iOS8或更高版本使用UIAlertController

 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

例如: https : //github.com/KiritVaghela/UIAlertController

我写我的时间select器,而不是UIActionSheet在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];} 

尝试使用这个动作表模拟:

 @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 

我面临同样的问题,并通过这种方式解决它将在所有ios版本中工作

在iOS 8苹果已经改变了很多东西,我在这里面临着我自己的项目中的一个问题,所以,我只是想提供更换UIActionsheet的解决scheme。

不推荐使用ios 8 UIActionsheet ,也不推荐使用它的委托方法。 而不是带有UIAlertController
UIAlertControllerStyleActionSheet 。 你也可以检查这个线程:

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

这个例子可以在ios 8和之前的版本中使用。

在.h文件中声明这个variables

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

在.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]; } 

你也可以查看我的博客, http://ioscodesample.blogspot.in/2014/10/ios-8-changes-for-actionsheet.html

谢谢。

看看我的代码

 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]; 

我和你有同样的问题,显示与UIActionSheet的UIPickerView不工作在iOS 8中。因为UIActionSheet已弃用,Applebuild议使用UIAlertController。 所以我们应该轮到风。

我写了一些代码来解决我的情况。 我希望它可以帮助你。

 #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)]; }]; } } 

我认为这是解决这个问题的全部。 快乐的编码!

Interesting Posts