Ios UIAlertController中的UIView

Ios UIAlertController中的UIView,ios,objective-c,iphone,uiview,uialertcontroller,Ios,Objective C,Iphone,Uiview,Uialertcontroller,在开始之前,我只想说几点: 我刚刚接管了这个代码 我在iOS代码方面几乎没有经验 在这看来我是个疯子,所以对我来说轻松点:P/P> 下面我有一些代码,用于显示UIActionSheet。在iOS 8中,UIActionSheet已被删除,感谢苹果!所以我已经开始改变一切,使用UIAlertController。。。 我遇到了很多我已经解决的问题,现在我完全糊涂了,需要你们这些有经验的人来帮助我 这是一个截图 现在您可以看到UIAlertController正在显示,但UIView位置不正确,因

在开始之前,我只想说几点: 我刚刚接管了这个代码 我在iOS代码方面几乎没有经验 在这看来我是个疯子,所以对我来说轻松点:P/P> 下面我有一些代码,用于显示UIActionSheet。在iOS 8中,UIActionSheet已被删除,感谢苹果!所以我已经开始改变一切,使用UIAlertController。。。 我遇到了很多我已经解决的问题,现在我完全糊涂了,需要你们这些有经验的人来帮助我

这是一个截图

现在您可以看到UIAlertController正在显示,但UIView位置不正确,因此无法使用这些控件!您可以按预期拖动数字,但这并不是那么容易

如您所见,有三个控制器,一个用于选择日期时间,一个用于乘客数量,另一个用于选择车辆类型

我只需要一个很好的简单的修复程序,可以在所有iOS8手机上运行,它可能会有点不可靠,因为我们即将雇佣一个人来重新编写整个代码,因为代码总体上非常糟糕,我们希望从下到上重新设计应用程序

如果您想了解更多信息,请务必让我知道,我的iOS编码经验非常少,我很想学习,因为我很喜欢它,尽管没有Android那么多

else if (selectedTableField == travelTimeText || selectedTableField == noPassengers || selectedTableField == carType) {

            // setup actionsheet to contain the UIPicker

            if (version < 8)
            {
            actionSheet = [[UIActionSheet alloc] initWithTitle:@"            "
                                                      delegate:self
                                             cancelButtonTitle:nil
                                        destructiveButtonTitle:nil
                                             otherButtonTitles:nil];

            [actionSheet showInView:self.view];
            }

            if (version >= 8)
            {
                alertController = [UIAlertController alertControllerWithTitle:@"title"
                                                                    message:@"messages"
                                                             preferredStyle:UIAlertControllerStyleAlert];
            }

            //CGRect actionSheetBounds = CGRectMake(0,0,320 + offset, 570);

            CGRect actionSheetBounds;

            if (selectedTableField == travelTimeText)
               // actionSheetBounds = CGRectMake(0,0,320 + offset, 655);

            if (version >= 8)
            {
                [alertController.view setBounds:actionSheetBounds];
            }
            else
            {
                [actionSheet setBounds:actionSheetBounds];
            }

            UIView *bgView = [[UIView alloc] initWithFrame:actionSheetBounds];

            if (version < 7)
                bgView.backgroundColor = [[[ConfigManager sharedInstance].skin valueForKey:@"popupBackgroundColour"] toUIColor];

            UIButton *doneBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            // swap asap and select around if on travel time picker
            if (selectedTableField == travelTimeText) {
                doneBtn.frame = CGRectMake(10+bOffset, 305, 300, 40);
            } else {
                doneBtn.frame = CGRectMake(10+bOffset, 250, 300, 40);
            }
            [doneBtn addTarget:self action:@selector(pickerDone:) forControlEvents:UIControlEventTouchUpInside];
            [doneBtn setBackgroundImage:[UIImage imageNamed:@"button_large.png"] forState:UIControlStateNormal];
            [doneBtn setTitle:@"Select" forState:UIControlStateNormal];
            doneBtn.titleLabel.font = [UIFont boldSystemFontOfSize:19];
            doneBtn.titleLabel.textColor = [[[ConfigManager sharedInstance].skin valueForKey:@"popupButtonFontColour"] toUIColor];
            [bgView addSubview:doneBtn];

            UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320 + offset, 20)];
            title.font = [UIFont boldSystemFontOfSize:12];
            title.backgroundColor = [UIColor clearColor];
            title.textAlignment = UITextAlignmentCenter;
            title.textColor = [[[ConfigManager sharedInstance].skin valueForKey:@"popupLabelFontColour"] toUIColor];

            if (selectedTableField == travelTimeText) {
                title.text = @"Booking Time";

                UIButton *asapBtn = [UIButton buttonWithType:UIButtonTypeCustom];
                asapBtn.frame = CGRectMake(10 +bOffset, 250, 300, 40);
                [asapBtn addTarget:self action:@selector(pickerAsap:) forControlEvents:UIControlEventTouchUpInside];
                [asapBtn setTitle:@"As soon as possible" forState:UIControlStateNormal];
                [asapBtn setBackgroundImage:[UIImage imageNamed:@"button_large.png"] forState:UIControlStateNormal];
                asapBtn.titleLabel.font = [UIFont boldSystemFontOfSize:19];
                asapBtn.titleLabel.textColor = [[[ConfigManager sharedInstance].skin valueForKey:@"popupButtonFontColour"] toUIColor];
                [bgView addSubview:asapBtn];
            } else if (selectedTableField == noPassengers)
                title.text = @"Passengers";
            else
                title.text = @"Vehicle";

            [bgView addSubview:title];

            [title release];
            if (version < 8)
            {
            [actionSheet addSubview:bgView];
            }
            else
            {
                [alertController.view addSubview:bgView];
            }
            [bgView release];

            // travel time uses a different picker
            if (selectedTableField == travelTimeText) {
                UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0 + bOffset, 20, 0.0, 0.0)];

                [datePicker addTarget:self action:@selector(travelTimeChanged:) forControlEvents:UIControlEventValueChanged];
                datePicker.datePickerMode = UIDatePickerModeDateAndTime;
                datePicker.minuteInterval = 5;
                if (travelTime == nil)
                    datePicker.date = [[NSDate date] addTimeInterval:15*60];
                else
                    datePicker.date = travelTime;

                if (version < 8)
                {
                [actionSheet addSubview:datePicker];
                }
                else
                {
                    [alertController.view addSubview:datePicker];
                }

                // update table field to show now
                [self travelTimeChanged:datePicker];

                [datePicker release];

                if (version >= 8)
                {
                    [self presentViewController:alertController animated:NO completion:nil];
                }

            } else {
                UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0 + bOffset, 20, 0.0, 0.0)];
                picker.dataSource = self;
                picker.delegate = self;
                if (selectedTableField == noPassengers) {
                    picker.showsSelectionIndicator = YES;
                    [picker selectRow:[passengerOptions indexOfObject:noPassengers.text] inComponent:0 animated:NO];
                } else if (selectedVehicle != nil) {
                    [picker selectRow:[filteredCarOptions indexOfObject:selectedVehicle] inComponent:0 animated:NO];
                }
                if (version < 8)
                {
                [actionSheet addSubview:picker];
                }
                else
                {
                    [alertController.view addSubview:picker];
                }

                [picker release];

                if (version >= 8)
                {
                    [self presentViewController:alertController animated:NO completion:nil];
                }
            }

        } else if (selectedTableField == bookButton) {
            // validate the form
            [self validateForm];
        }

我也在努力解决同样的问题。我需要在UIAlertController中有一个UIPickerView。经过几个小时的调查,我发现没有办法定制UIAlertController的视图。事实上,它明确地写在苹果的文档中

UIAlertController类旨在按原样使用,不支持子类化

此类的视图层次结构是私有的,不能修改

顺便说一句,您可以尝试其他解决方案-。

在此处查看我的答案: