【问题标题】:iPhone display date picker on UITextField touchiPhone在UITextField touch上显示日期选择器
【发布时间】:2012-06-27 05:04:28
【问题描述】:

我关注了这个帖子:datepicker by clicking on textfield

我导入了以下两个协议:

@interface ViewController : UIViewController<UIActionSheetDelegate, UITextFieldDelegate> {

然后,在实现中,我使用以下内容:

- (void)viewDidLoad {

    textField.delegate = self;

[super viewDidLoad] }

最后,我将实际代码用于显示日期选择器(来自线程)。我还在 IB 中将它们全部链接起来。

    //Date Picker
- (void)textFieldDidBeginEditing:(UITextField *)aTextField{    
    [aTextField resignFirstResponder];  

    pickerViewPopup = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];  

    UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 44, 0, 0)];  
    pickerView.datePickerMode = UIDatePickerModeDate;  
    pickerView.hidden = NO;  
    pickerView.date = [NSDate date];  

    UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];  
    pickerToolbar.barStyle = UIBarStyleBlackOpaque;  
    [pickerToolbar sizeToFit];  

    NSMutableArray *barItems = [[NSMutableArray alloc] init];  

    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];  
    [barItems addObject:flexSpace];  

    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)];  
    [barItems addObject:doneBtn];  

    UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)];  
    [barItems addObject:cancelBtn];  

    [pickerToolbar setItems:barItems animated:YES];  

    [pickerViewPopup addSubview:pickerToolbar];  
    [pickerViewPopup addSubview:pickerView];  
    [pickerViewPopup showInView:self.view];  
    [pickerViewPopup setBounds:CGRectMake(0,0,320, 464)];    
}  

-(void)doneButtonPressed:(id)sender{  
    //Do something here here with the value selected using [pickerView date] to get that value  
        [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES];  
}  

-(void)cancelButtonPressed:(id)sender{  
    [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES];  
}  

但是,当我点击 UITextField 时,我得到了这个:

我做错了什么?

【问题讨论】:

  • 为了好玩,尝试将“[super viewDidLoad]”行放在“textField.delegate = self;”之前在你的 viewDidLoad 方法中添加一行!
  • 我刚才试过了。结果相同:(

标签: iphone datepicker uitextfield protocols


【解决方案1】:

您可以使用UITextField 输入视图属性。只需在代码中分配一个常规的 UIDatePicker 并将其分配给文本字段的 inputView。这样做,UIPickerView 将出现而不是键盘。如果您需要任何代码,请随时询问:)

编辑:代码

你用 IB 将你的 textField 联系起来

@interface myViewController <UITextFieldDelegate>
@property (nonatomic,weak) IBOutlet UITextField *myTextField;
@end 

在实施中

UIDatePicker *datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];
if (@available(iOS 13.4, *)) {
    [datePicker setPreferredDatePickerStyle:UIDatePickerStyleWheels];
}       
[self.myTextField setInputView:datePicker];

当您点击textField 时,会弹出一个UIDatePicker。请注意我添加到 datePicker 中的操作。

[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];

要在每次用户在选择器中滚动时更新 textField,您只需要在 viewController 中的某处实现 updateTextField 方法

-(void)updateTextField:(id)sender
{
  UIDatePicker *picker = (UIDatePicker*)self.myTextField.inputView;
  self.myTextField.text = [NSString stringWithFormat:@"%@",picker.date];
}

使用最后一种方法,每次用户旋转选择器时,文本字段都会更新!

  • 您可以使用NSDateFormatter 来改进字符串的输出。

【讨论】:

  • 我讨厌麻烦,但你能举一些例子来说明你的意思吗?我不关注 :P 我对 iPhone 开发很陌生。
  • 我已经给你添加了代码,如果你需要进一步的解释,尽管问!
  • 我应该把代码的UIDatePicker部分放在哪里?
  • 我会把它放在 viewDidLoad 中
  • 当我这样做时,我收到错误:“日期选择器暂时不可用”。
【解决方案2】:

以下是我显示日期选择器的方式。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{


    self.activeTextField = textField;

    // Create a date picker for the date field.
    UIDatePicker *datePicker = [[UIDatePicker alloc]init];
    datePicker.datePickerMode = UIDatePickerModeDate;
    datePicker.minimumDate = [NSDate dateWithTimeIntervalSinceNow:-31536000];
    [datePicker setDate:[NSDate date]];
    [datePicker addTarget:self action:@selector(updateDateField:) forControlEvents:UIControlEventValueChanged];

    // If the date field has focus, display a date picker instead of keyboard.
    // Set the text to the date currently displayed by the picker.
    if (textField.tag == 1)
    {
    self.date.inputView = datePicker;
    self.date.text = [self formatDate:datePicker.date];
    }   
}


// Called when the date picker changes.
- (void)updateDateField:(id)sender
{
    UIDatePicker *picker = (UIDatePicker*)self.date.inputView;
    self.date.text = [self formatDate:picker.date];
}


// Formats the date chosen with the date picker.
- (NSString *)formatDate:(NSDate *)date
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateFormat:@"MM'/'dd'/'yyyy"];
    NSString *formattedDate = [dateFormatter stringFromDate:date];
    return formattedDate;
}

【讨论】:

    【解决方案3】:

    这是我在 Swift 4 中所做的:

    let datePicker = UIDatePicker()
    @IBOutlet weak var myTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setDatePicker()
    }
    
    func setDatePicker() {
        //Format Date
        datePicker.datePickerMode = .date
    
        //ToolBar
        let toolbar = UIToolbar();
        toolbar.sizeToFit()
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneDatePicker));
        let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
    
        toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
    
        myTextField.inputAccessoryView = toolbar
        myTextField.inputView = datePicker
    }
    
    @objc func doneDatePicker(){
        let formatter = DateFormatter()
        formatter.dateFormat = "MM/dd/yyyy"
        myTextField.text = formatter.string(from: datePicker.date)
        self.view.endEditing(true)
    }
    
    @objc func cancelDatePicker(){
        self.view.endEditing(true)
    }
    

    【讨论】:

      【解决方案4】:

      @JRo 解决方案效果很好!

      这是我在 Swift 3 中更新的代码:

      func textFieldDidBeginEditing(_ textField: UITextField) {
          self.activeTextField = textField
      
          // Create a date picker for the date field.
          let picker = UIDatePicker()
          picker.datePickerMode = .date
          picker.addTarget(self, action: #selector(updateDateField(sender:)), for: .valueChanged)
      
          // If the date field has focus, display a date picker instead of keyboard.
          // Set the text to the date currently displayed by the picker.
          textField.inputView = picker
          textField.text = formatDateForDisplay(date: picker.date)
      }
      
      
      // Called when the date picker changes.
      
      func updateDateField(sender: UIDatePicker) {
          activeTextField?.text = formatDateForDisplay(date: sender.date)
      }
      
      
      // Formats the date chosen with the date picker.
      
      fileprivate func formatDateForDisplay(date: Date) -> String {
          let formatter = DateFormatter()
          formatter.dateFormat = "dd MMM yyyy"
          return formatter.string(from: date)
      }
      

      【讨论】:

      • 一段很棒的代码。为了使它在 Swift4 中工作,只需在 func updateDateField 之前添加 @objc
      【解决方案5】:

      斯威夫特 4.2
      您可以通过使用 UITextField Extension 编写一行代码来实现这一点。
      Credit: http://www.swiftdevcenter.com/

      
      import UIKit
      
      extension UITextField {
      
          func setInputViewDatePicker(target: Any, selector: Selector) {
              // Create a UIDatePicker object and assign to inputView
              let screenWidth = UIScreen.main.bounds.width
              let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))//1
              datePicker.datePickerMode = .date //2
              self.inputView = datePicker //3
      
              // Create a toolbar and assign it to inputAccessoryView
              let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0)) //4
              let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) //5
              let cancel = UIBarButtonItem(title: "Cancel", style: .plain, target: nil, action: #selector(tapCancel)) // 6
              let barButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector) //7
              toolBar.setItems([cancel, flexible, barButton], animated: false) //8
              self.inputAccessoryView = toolBar //9
      
          }
      
          @objc func tapCancel() {
              self.resignFirstResponder()
          }
      
      }
      
      

      在您的 UIViewController 类中编写以下代码。

      
      class ViewController: UIViewController {
      
          @IBOutlet weak var myTextField: UITextField!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              // Do any additional setup after loading the view, typically from a nib.
              self.myTextField.setInputViewDatePicker(target: self, selector: #selector(tapDone(sender:datePicker1:))) //1
          }
      
          //2
          @objc func tapDone(sender: Any, datePicker1: UIDatePicker) {
              print(datePicker1)
              if let datePicker = self.myTextField.inputView as? UIDatePicker { // 2.1
                  let dateformatter = DateFormatter() // 2.2
                  dateformatter.dateStyle = .medium // 2.3
                  self.myTextField.text = dateformatter.string(from: datePicker.date) //2.4
              }
              self.myTextField.resignFirstResponder() // 2.5
          }
      
      }
      
      

      更多详情请访问:http://www.swiftdevcenter.com/uidatepicker-as-input-view-to-uitextfield-swift/

      【讨论】:

        【解决方案6】:

        请完成这个过程 在 .h 文件中为 UIDatePicker 创建对象

        UIDatePicker *datePicker;
        

        在.m文件中查看DidloadMethod

        datePicker = [[UIDatePicker alloc]init];
        datePicker.datePickerMode = UIDatePickerModeDate;
        datePicker.minimumDate = [NSDate date];
        [_dateTxtFld setInputView:datePicker];
        UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
        [toolBar setTintColor:[UIColor grayColor]];
        UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(showSelectedDate)];
        UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        [toolBar setItems:[NSArray arrayWithObjects:space,doneBtn, nil]];
        
        [_dateTxtFld setInputAccessoryView:toolBar];
        

        之后你可以创建 ShowSele

        -(void)showSelectedDate {
            if ([_dateTxtFld isFirstResponder]) {
                NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
                [formatter setDateFormat:@"YYYY-MM-dd"];
                _dateTxtFld.text=[NSString stringWithFormat:@"%@",[formatter stringFromDate:datePicker.date]];
               [_dateTxtFld resignFirstResponder];
            }
           else if ([_timeTxtFld isFirstResponder]) {
           }
        }
        

        这对我有用。

        【讨论】:

          【解决方案7】:

          一个不错的方法是创建自己的类(我称之为TextFieldFormDate),它派生自UITextField,并封装了所有必需的行为。然后在故事板中将文本字段的类设置为TextFieldFormDate(在我的例子中)。

          在您的 ViewController 中使用 didChangedidSelect(即使用 TextFieldFormDate)以收到更改通知以及实际选择日期的时间。

          class TextFieldFormDate: UITextField {
          
              var date : Date {
                  set {
                     picker.date = newValue
                     text = newValue.localizedDateOnly()
                  }
          
                  get {
                      return picker.date
                  }
              }
          
              //public handlers
              var didChange : ( (Date)->() )?
              var didSelect : ( (Date)->() )?
          
              private var picker : UIDatePicker {
                  return inputView as! UIDatePicker
              }
          
              override func awakeFromNib() {
                  super.awakeFromNib()
                  setup()
              }
          
              private func setup() {
                  font = UIFont.defaultFont()
                  //picker for datefield
                  inputView = UIDatePicker(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
                  picker.datePickerMode = .date
                  picker.addTarget(self, action: #selector(pickerChanged), for: .valueChanged)
                  let toolBar = UIToolbar()
                  toolBar.tintColor = PaintCode.mainBlue
                  toolBar.items = [
                      UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
                      BarBtnPaintCode(type: "done", target: self, action: #selector(didPressDone))
                  ]
                  toolBar.sizeToFit()
                  inputAccessoryView = toolBar
              }
          
              @objc private func pickerChanged() {
                  text = date.localizedDateOnly()
                  didChange?(picker.date)
              }
          
              @objc private func didPressDone() {
                  text = date.localizedDateOnly()
                  resignFirstResponder()
                  didSelect?(picker.date)
              }
          
          }
          

          【讨论】:

            【解决方案8】:

            将日期选择器添加到 UITextField 作为输入视图 - Swift 代码。希望对大家有所帮助。 :)

            func addTimePickerToTimeTextFieldView() {
            
                timePicker = UIDatePicker()
                timePicker?.datePickerMode = .time
                timeTextField.inputView = timePicker
            
                timePicker?.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
                timePicker?.setValue(#colorLiteral(red: 0.03921568627, green: 0.2352941176, blue: 0.3647058824, alpha: 1), forKeyPath: "textColor")
            
                timePicker?.addTarget(self, action: #selector(timeSelectedByUser(_:)), for: .valueChanged)
            
                let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped(_:)))
                view.addGestureRecognizer(tapGesture)
            
            }
            
            @objc func timeSelectedByUser(_ sender: UIDatePicker) {
            
                let formatter = DateFormatter()
                formatter.timeStyle = .short
                timeTextField.text = formatter.string(from: sender.date)
            
                //Convert Time for API - 24 hours format
                apiFormatter.dateFormat = "HH:mm"
                timeForApi = apiFormatter.string(from: sender.date)
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多