【问题标题】:How to use single IOS UIDatePicker object for multiple UITextfields如何为多个 UITextfields 使用单个 IOS UIDatePicker 对象
【发布时间】:2014-07-04 07:47:43
【问题描述】:

我有以下三个与 UIDatePickers 关联的 UITextfields。

self.taskDate.inputView=[self returnDatePickerView:01];
self.taskStartTime.inputView=[self returnDatePickerView:02];
self.taskEndtime.inputView=[self returnDatePickerView:03];

这是我的 DatePicker 方法

    - (UIView *)returnDatePickerView:(int)tag{
    UIToolbar *toolBar1 = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    toolBar1.barStyle = UIBarStyleBlackTranslucent;
    UIBarButtonItem *doneButton3 = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                    style:UIBarButtonItemStyleBordered
                                                                   target:self
                                                                   action:@selector(taskDateDone)];
    [toolBar1 setItems:[NSArray arrayWithObjects:doneButton3, nil]];
    UIView *dateView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
    datePicker = [[UIDatePicker alloc] initWithFrame:pickerFrame];
    if(tag==01){
    datePicker.datePickerMode=UIDatePickerModeDate;
    }else{
    datePicker.datePickerMode=UIDatePickerModeTime;
    }
    //Setting user selected date as the date picker default
    [datePicker setDate:taskDate animated:YES];
    [datePicker addTarget:self action:@selector(taskDatePicked:)forControlEvents:UIControlEventValueChanged];
    [dateView addSubview:datePicker];
    [dateView addSubview:toolBar1];
    return dateView;
 }

这是我的回调 taskDatePicked

- (void)taskDatePicked:(id)sender
{
NSDateFormatter *systemtimeFormatter = [[NSDateFormatter alloc] init];
NSLog(@"tag %ld",textFieldTag);
//[systemtimeFormatter setTimeZone:[NSTimeZone systemTimeZone]];
if(textFieldTag==01){
     taskDate = datePicker.date;
    [systemtimeFormatter setDateStyle:NSDateFormatterShortStyle];
    self.taskDate.text=[[NSString alloc] initWithString:[systemtimeFormatter stringFromDate:taskDate]];
}else if(textFieldTag==02){
     taskStartTime = datePicker.date;
    [systemtimeFormatter setTimeStyle:NSDateFormatterShortStyle];
    self.taskStartTime.text=[[NSString alloc] initWithString:[systemtimeFormatter stringFromDate:taskStartTime]];
     NSLog(@"taskStartTime picked date %@",taskStartTime.description);
}else if(textFieldTag==03){
    taskEndTime = datePicker.date;
    [systemtimeFormatter setTimeStyle:NSDateFormatterShortStyle];
    self.taskEndtime.text=[[NSString alloc] initWithString:[systemtimeFormatter stringFromDate:taskEndTime]];
}
[datePicker reloadInputViews];
}

但是这个方法并不适用于所有的 UITextfieds。 我在这里做错了什么。请推荐

【问题讨论】:

    标签: ios objective-c ios7 uidatepicker


    【解决方案1】:

    尝试使用以下代码将单个日期选择器用作具有不同日期/时间格式的多个文本字段的输入视图。

    此处文本字段的输入视图在文本字段委托中分配。

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

    考虑UIDatePicker *datePicker; 是常用的日期选择器,NSInteger textFieldTag; 保存当前文本字段的标签(两者都添加在界面扩展中)。

    确保为文本字段分配标签值,并为每个字段连接委托。然后在viewDidLoad方法中添加以下内容。

    datePicker = [[UIDatePicker alloc] init];
    [datePicker addTarget:self action:@selector(taskDatePicked:) forControlEvents:UIControlEventValueChanged];
    

    添加文本字段委托,如:

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
    {
        switch (textField.tag)
        {
            case 1:
                datePicker.datePickerMode = UIDatePickerModeDate;
                break;
            case 2:
                datePicker.datePickerMode = UIDatePickerModeTime;
                break;
            case 3:
                datePicker.datePickerMode = UIDatePickerModeTime;
                break;
            default:
                break;
        }
        textField.inputView = datePicker;
        textFieldTag = textField.tag;
        return YES;
    }
    

    并且随着日期选择器变化触发的事件如下:

    - (void)taskDatePicked:(id)sender
    {
    
        UITextField *textField = (UITextField *)[self.view viewWithTag:textFieldTag];
        NSDateFormatter *dateformatter = [[NSDateFormatter alloc]init];
        dateformatter.dateStyle        = NSDateFormatterMediumStyle;
        switch (textFieldTag)
        {
            case 1:
                [dateformatter setDateFormat:@"dd-MM-YYYY"];
                break;
            case 2:
                [dateformatter setDateFormat:@"hh:mm a"];
                break;
            case 3:
                [dateformatter setDateFormat:@"hh:mm a"];
                break;
            default:
                break;
        }
        textField.text = [dateformatter stringFromDate:[datePicker date]];
    }
    

    【讨论】:

      【解决方案2】:

      请将标签值设置为 textFieldTag

      - (UIView *)returnDatePickerView:(int)tag{
          UIToolbar *toolBar1 = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
          toolBar1.barStyle = UIBarStyleBlackTranslucent;
          UIBarButtonItem *doneButton3 = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                          style:UIBarButtonItemStyleBordered
                                                                         target:self
                                                                         action:@selector(taskDateDone)];
          [toolBar1 setItems:[NSArray arrayWithObjects:doneButton3, nil]];
          UIView *dateView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
          datePicker = [[UIDatePicker alloc] initWithFrame:pickerFrame];
          if(tag==01){
          datePicker.datePickerMode=UIDatePickerModeDate;
          }else{
          datePicker.datePickerMode=UIDatePickerModeTime;
          }
          //Setting user selected date as the date picker default
          [datePicker setDate:taskDate animated:YES];
          [datePicker addTarget:self action:@selector(taskDatePicked:)forControlEvents:UIControlEventValueChanged];
           textFieldTag = tag;
          [dateView addSubview:datePicker];
          [dateView addSubview:toolBar1];
          return dateView;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多