iphone - UIDatePicker中

  显示原文与译文双语对照的内容

我和UIDatePicker在战斗。我想我可以把它添加到我当前的视图中,如同我一个普通subview一样。 经过一些搜索之后,我找到了将它放入popover的文档。 我按照这些指示,让它在iPad上工作。 但是popovers不在iPhone上工作。 我需要做什么才能使它在那里工作? 为什么我不能像普通subview那样简单地添加它?

以下是我的iPad代码:


-(void)selectADate: (CGPoint)p
{
 UIViewController* popoverContent = [[UIViewController alloc] init];//ViewController
 UIView *popoverView = [[UIView alloc] init];//view
 popoverView.backgroundColor = [UIColor blackColor];
 UIDatePicker *datePicker=[[UIDatePicker alloc]init];//Date picker
 datePicker.frame=CGRectMake(0,44,320, 216);
 datePicker.datePickerMode = UIDatePickerModeDate;
 [datePicker setTag:10];
 datePicker.date = self.displayedDate;
 [datePicker addTarget:self action:@selector(pickerChanged:) forControlEvents:UIControlEventValueChanged];
 [popoverView addSubview:datePicker];
 popoverContent.view = popoverView;
 UIPopoverController * popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
//popoverController.delegate=self;
 self.datePopover = popoverController;
 [popoverController setPopoverContentSize:CGSizeMake(320, 264) animated:NO];
 CGRect popoverLocation = CGRectMake(p.x-160, p.y-200, 320, 216);
 [popoverController presentPopoverFromRect:popoverLocation inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];//tempButton.frame where you need you can put that frame//
}

- (void)pickerChanged:(id)sender
{
 self.displayedDate = [sender date];
 [self showMonthContainingDate:[sender date]];
}

我的屏幕目前被布置为一个显示日期的日历页面。 每天卖出的都是 subview 。 当使用标题显示标题时,用户将显示与选中日期相对应的日期。日期选取器显示日期。日期选择器。日期选择器。日历页显示日期。日历页显示的日期与选定日期的日期不同。

我不确定为什么我甚至需要一个 popover,除非只要提供一个空白视图来放置日历页面的平铺视图。 但是,我不能仅仅将它添加为 subview,然后调用 bringSubviewToFront:? 我尝试过,但它不能在iPad上工作,所以我对popover的使用。

我可以在添加它的他subviews时显示它,但是当我点击标题时,它会显示出来。 下面是我的点击代码:


- (IBAction)tap:(UITapGestureRecognizer *)sender {
//tap gesture recognizer
//Assume the user tapped on a day cell.
 for (UIView *dayCell in self.view.subviews) {
 if (CGRectContainsPoint(dayCell.frame, [sender locationInView:self.view])) {
//found the cell that was touched.
//NSLog(@"Found a view containing the touch with coords. %@",NSStringFromCGRect(dayCell.frame));
 for (UIView *insideView in dayCell.subviews) {
 for (UILabel *dayElement in insideView.subviews) {
//found a subview of the day cell.
 if ([dayElement isKindOfClass:[UILabel class]]) {
 NSLog(@"Found a subview %@",dayElement.text);
 }
 }
 }
 }
 if ([dayCell isKindOfClass:[UILabel class]]) {
//This is the heading label.
 UILabel * headingLabel = (UILabel *) dayCell;
 if (CGRectContainsPoint(headingLabel.frame, [sender locationInView:self.view])) {
 NSLog(@"The heading was tapped");
 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
//iPhone code goes here
 [self iphoneSelectADate:[sender locationInView:self.view]];
 } else {
 [self selectADate:[sender locationInView:self.view]];
 }
 }
 }
 }
}

以下是当前未工作的iPhone代码:


-(void)iphoneSelectADate: (CGPoint)p
{
 UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)];
 [datePicker setDate:[NSDate date]];//This is the default
 [datePicker setHidden:NO];
 [self.view addSubview:datePicker];
}

如果我在调试器中进行,我会看到这个代码被执行,但是,不显示。

时间: 原作者:

UIDatePicker 继承自 UIView,因此你可以像 UILabel 一样添加它。 确保你给了它一个框架。

像这样的东西在iPhone屏幕的底部会起作用:


datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)];
[datePicker setDate:[NSDate date]];//This is the default
[self.view addSubview:datePicker];

听起来你可能有subview分层问题而不是 UIDatePicker 问题。

如果这不起作用,发布一些代码,我们将帮助你解决这一问题。

原作者:

不确定这是否会有帮助,但是已经存在的视图的UI更改需要使用main_queue调度。 dispatch_async(dispatch_get_main_queue(), ^ { [self.view addSubview:yourSubview]; });

原作者:

我想我可能找到了我问题的关键。 通过阅读文档,在不同地方放置定位相关代码的地方,我决定在上。 我再次阅读文档,决定尝试将该代码放入 viewWillAppear 中,这似乎解决了问题。

对使用 viewWillAppear的更改还需要实现 willAnimateRotationToInterfaceOrientation:duration:

它看起来像是 viewWillLayoutSubviews 需要的,但不是 iPhone,所以我还添加了这个:


-(void)viewWillLayoutSubviews
{
 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
//iPhone code goes here (empty, since calling showMonthContainingDate: doesn't work from here in iPhone
 } else {
//ipad code goes here
 NSDate *dayToDisplay = self.displayedDate;
 [self showMonthContainingDate:dayToDisplay];
//iPad uses wrong dimensions unless the routine is called from here.
 }
}

最后一个注意事项是,设备的方向没有正确设置--在启动时是在iPhone上的景观。 除了这个答案对另一个问题的回答,iPhone总是以纵向的方式启动,除非它是。

原作者:
...