UIDatePicker在iOS 8中不可见

时间:2014-07-10 09:47:29

标签: ios8

我遇到日期选择器问题,即UIDatePicker在iOS 8以外的所有版本中都运行正常。

代码:

UIDatePicker *datePicker = [[UIDatePicker alloc]init];
    [datePicker setDate:[NSDate date]];
    [datePicker setDatePickerMode:UIDatePickerModeDate];
    datePicker.maximumDate=[NSDate date];
    [datePicker addTarget:self action:@selector(updateBirthdateField:) forControlEvents:UIControlEventValueChanged];
    [birthdatField setInputView:datePicker];

5 个答案:

答案 0 :(得分:7)

在Xcode 6.0.1中,这对我来说是一个模拟器问题。这适用于设备(​​带有iOS 8发行版的iPhone 4S)。如前一个用户所述,以下步骤使我在iOS 8模拟器上可以看到日期选择器。

  • 启动模拟器和应用程序,然后单击将日期选择器作为输入视图的字段。

  • 现在按CMD + K(硬件 - >键盘 - >切换软件键盘),日期选择器变为可见。

同样,这只是一个模拟器问题,并且设备上没有出现此问题。

答案 1 :(得分:2)

我在iOS模拟器上遇到同样的问题 - 在iOS 7中工作,但在iOS 8下工作。要修复问题,请选择iOS模拟器的硬件菜单,然后选择键盘 - >切换软件键盘。

答案 2 :(得分:2)

我也遇到了这个问题,现在我通过以下两种不同的方法解决了这个问题:

1)。我使用了自定义的UIActionSheet,而不是UIView。只是将日期选择器添加到视图中并显示和解除。另请参阅此SWActionSheet

2)。我已经检查了如果操作系统版本大于8.0的条件,如果不是我使用UIActionSheet和其他UIAlertViewController。添加了选择器控制器作为子视图。

id ageActionSheet;

    if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
    {
        UIAlertController *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];

        ageToolbar.frame = CGRectMake(-8,0, 320, 45);
        ageTitleLbl.frame = CGRectMake(50, 3, 200, 40);
        picker.frame = CGRectMake(-20, 45, 360, frame.size.height - 50 );

        [alertController.view addSubview:ageToolbar];
        [alertController.view addSubview:ageTitleLbl];
        [alertController.view addSubview:picker];

        ageActionSheet = alertController;
    }
    else
    {
        ageActionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:nil cancelButtonTitle:@"" destructiveButtonTitle:nil otherButtonTitles: nil];
        [ageActionSheet addSubview:ageToolbar];
        [ageActionSheet addSubview:ageTitleLbl];
        [ageActionSheet addSubview:picker];
        [ageActionSheet sizeToFit];
    }

答案 3 :(得分:2)

由于在iOS8中不推荐使用UIActionSheet,你必须使用其他一些视图来保存UIDatePicker和UIToolBar ......在这个答案中,我使用了UIView来保存上面提到的UI对象。

@interface ViewController ()<UIActionSheetDelegate, UITextFieldDelegate>{ 

   UIActionSheet *pickerViewActionSheet;
   UIDatePicker *datePicker;
   UIToolbar *pickerToolbar;       
   UIView *dateView;
}
@property (strong, nonatomic) IBOutlet UITextField *dateOfBirthTextField;
@end


@implementation ViewController

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    if(textField == self.dateOfBirthTextField){        
    [textField resignFirstResponder];
    float platformVersion = 8.0;
    //Check for iOS 8.0+
    if([[[UIDevice currentDevice] systemVersion] floatValue ] >= platformVersion){

        // iOS8 DatePicker view implementation
        dateView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height/2.0, 320, 640)];
        pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
        pickerToolbar.barStyle=UIBarStyleBlackOpaque;
        [pickerToolbar sizeToFit];
        NSMutableArray *barItems = [[NSMutableArray alloc] init];
        UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dateChosen:)];
        [barItems addObject:barButtonItem];
        barButtonItem.tag = 123;
        [pickerToolbar setItems:barItems animated:YES];
        [dateView addSubview:pickerToolbar];
        datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 320.0, 300.0)];
        datePicker.datePickerMode = UIDatePickerModeDate;
        [datePicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];            
        datePicker.backgroundColor = [UIColor whiteColor];
        [dateView addSubview:datePicker];


        [self.view addSubview:dateView];

    }
    else { 
        //Pre iOS8.0 "usual" DatePicker implementation.           
        datePicker = [[UIDatePicker alloc] init];

        pickerViewActionSheet = [[UIActionSheet alloc] initWithTitle:@"Select the date!"
                                                     delegate:self
                                            cancelButtonTitle:nil
                                       destructiveButtonTitle:nil
                                            otherButtonTitles:nil];

        datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 320.0, 300.0)];
        datePicker.datePickerMode = UIDatePickerModeDate;
        [datePicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
        datePicker.tag = -1;
        pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
        pickerToolbar.barStyle=UIBarStyleBlackOpaque;
        [pickerToolbar sizeToFit];
        NSMutableArray *barItems = [[NSMutableArray alloc] init];
        UIBarButtonItem *batButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonClicked)];
        [barItems addObject:batButtonItem];

        [pickerToolbar setItems:barItems animated:YES];
        [pickerViewActionSheet addSubview:pickerToolbar];
        [pickerViewActionSheet addSubview:datePicker];
        [pickerViewActionSheet showInView:self.view];
        [pickerViewActionSheet setBounds:CGRectMake(0,0,320, 464)];

       }

    }
}

//iOS8.0+ when the date has chosen, remove the corresponding view from the parent view.
-(void) dateChosen:(UIBarButtonItem *) barButton {
     if(barButton.tag ==123){
        [dateView removeFromSuperview];

     }

  }

 //Get the chosen date from the UIDatePicker to the corresponding UITextField.
 -(void)dateChanged{
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
     dateFormatter = [[NSDateFormatter alloc] init];
     [dateFormatter setDateFormat:@"dd/MM/yyyy"];
     self.dateOfBirthTextField.text = [dateFormatter stringFromDate:[datePicker date]];
  }

 //Pre iOS8.0 for closing the actionsheet
 -(BOOL)closeDatePicker:(id)sender{
     [pickerViewActionSheet dismissWithClickedButtonIndex:0 animated:YES];
     [self.dateOfBirthTextField resignFirstResponder];
     return YES;
  }

 //Pre iOS8.0
 -(void)doneButtonClicked{
     [self closeDatePicker:self];
  }
 @end

我希望这有帮助......

答案 4 :(得分:0)

它只是在切换软件键盘..

在模拟器中打开时转到..

Hardware >> Keyboard >> Toggle SOftware Keyboard...