iPhone中的UIDatePicker

Posted

技术标签:

【中文标题】iPhone中的UIDatePicker【英文标题】:UIDatePicker in iPhone 【发布时间】:2013-01-08 23:45:26 【问题描述】:

我正在努力使用 UIDatePicker。我以为我可以像添加普通子视图一样将它添加到当前视图中,但它没有出现。经过一番搜索,我找到了将其放入弹出框的文档。我按照这些说明让它在 iPad 上工作。但是弹出框在 iPhone 上不起作用。我需要做什么才能让它在那里工作?为什么我不能像常规子视图一样简单地添加它?

这是我的 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]];

我的屏幕目前布局为一种显示一个月天数的日历页面。每天的销售都是一个子视图。屏幕顶部是一个标题,其中包含年、月等信息。当用户点击标题时,会出现日期选择器,日历页面显示与选择器中选择的日期对应的所选月份突出显示日期(当天子视图的背景颜色不同)。

我不知道为什么我什至需要一个弹出框,除非它只是提供一个空白视图,用于放置日期选择器,该选择器位于我的日历页面的平铺视图前面。但是我不应该能够简单地将它添加为子视图,然后调用bringSubviewToFront:吗?我试过了,但它在 iPad 上不起作用,因此我使用了弹出框。

如果我在添加其他子视图时添加它,我可以让它显示,但我希望它在我点击标题时显示。这是我的点击代码:

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

如果我在调试器中单步执行,我会看到此代码已执行,但日期选择器不显示。

【问题讨论】:

您绝对可以像任何其他子视图一样将其添加到您的视图中。如果你在代码中尝试过,你应该显示它,这样我们就可以看到哪里出了问题。 我没有代码了。不过,我会说这个。我的屏幕完全与子视图平铺。我能够将它作为子视图添加到标题子视图,但该子视图不够大。所以我想把它添加到标题的父级,也就是self.view。什么都没有出现。我怀疑它可能存在但在其他子视图后面。也许我会再试一次并发布代码,如果它不起作用。 @rdelmar,如果我更改行 [self.view addSubview:datePicker];到 [self.view.superview addSubview:datePicker];有用。任何解释为什么这会起作用,但我的问题中显示的代码不起作用?关闭日期选择器的标准方法是什么? 我不知道你的结构是什么。尝试记录 self.view 和 self.view.superview 看看他们给你什么。听起来你在那里有额外的视野。要解雇,我会使用 [datePicker removeFromSuperview]; @rdelmar,谢谢。解雇了。你能告诉我如何进行日志记录吗?我需要学习如何以某种方式显示/列出视图层次结构。 【参考方案1】:

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

听起来您可能遇到了子视图分层问题,而不是 UIDatePicker 问题。

如果这不起作用,请发布您的一些代码,我们会帮助您解决问题。

【讨论】:

我想我正在取得一些进展。如果我将代码放在显示日历页面的方法中,则会显示日期选择器。如果我将它放在我的点击手势识别器中,它不会显示。我不希望在用户点击标题之前显示它。 仍然无法正常工作。一部分是为了展示整个项目,一部分是为了学习github,我把它推送到github.com/victorengel/calendar(我之前从未使用过github,所以如果我需要提供不同的URL,请告诉我)。【参考方案2】:

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

【讨论】:

谢谢。我没有做任何线程,所以我认为一切都在主队列中。但是,我是新手,我做的唯一线程是动画块(但不在这个项目中)。 ... 或者手势是在不同的线程上处理的?如果是这样,那可能是我的问题。【参考方案3】:

我想我可能找到了解决问题的关键。在阅读了this document 在各个地方放置与方向相关的代码后,我决定使用viewWillLayoutSubviews。我再次阅读了文档并决定尝试将代码放入viewWillAppear,这似乎已经解决了问题。

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

看起来 iPad 需要 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 在启动时的横向。根据this answer to another question 的说法,iPhone 总是以纵向启动,除非它是一个仅限横向的应用程序。

【讨论】:

添加选择器后,再次调用viewWillLayoutSubviews。将您所做的事情放在 viewWillLayoutSubviews 中的问题在于,您将许多方法链接在一起,其中之一,删除,删除了所有 self.views 子视图,包括选择器。 ViewWillLayoutSubviews 再次被调用因为选择器被添加了。显然,视图的变化会触发该方法。我忘记了它正在这样做,并且稍后会处理它。也许可以以某种方式抑制第二个。 没有改为使用 viewWillAppearAnimated: 工作吗?当我尝试它时它似乎工作(至少让选择器视图出现)。我认为这是放置代码的更好位置。 是的。这就是我正在做的事情。最后一条评论更多地是关于我的学习,而不是关于使应用程序正常工作。我实际上不会那样构建应用程序。抱歉,如果这具有误导性。 @rdelmar,其实还是有问题的。由于某种原因,从 viewWillAppear:Animated: 旋转无法正常工作。它正在计算错误的尺寸。我也不认为您关于删除的想法是正确的,因为我添加了代码以不删除日期选择器,但它仍然没有出现。

以上是关于iPhone中的UIDatePicker的主要内容,如果未能解决你的问题,请参考以下文章

从 iphone 相机拍照时收到 iphone 中的内存警告问题

iPhone 4S 与 iPhone 3GS 中的 UILabel

在其他 iPhone 中安装时,iPhone 中的应用程序安装失败

如何处理iphone中的关键事件

iphone中的网络存档

iPhone中的UIAccelerometer