28

我关注了这个线程:datepicker by click 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 时,我得到了这个:

在此处输入图像描述

我究竟做错了什么?

4

8 回答 8

69

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

编辑:代码

textField用 IB把你的拳头勾起来

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

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

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

要在每次用户在选择器中滚动时更新 textField,您只需updateTextFieldviewController

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

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

  • 您可以使用 aNSDateFormatter来改善字符串的输出。
于 2012-06-25T22:48:48.140 回答
12

下面是我如何显示日期选择器。

- (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;
}
于 2013-06-19T15:21:06.660 回答
6

这是我在 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)
}
于 2019-05-13T15:06:40.357 回答
4

Swift 4.2
你可以通过使用 UITextField Extension 编写一行代码来实现这一点。
信用: 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/

于 2019-04-07T04:13:38.717 回答
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)
}
于 2018-05-29T14:02:31.337 回答
0

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

在您的 ViewController 中使用didChangeand didSelect(即使用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)
    }

}
于 2018-08-05T17:49:22.380 回答
0

请在 .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]) {
   }
}

它对我有用。

于 2017-01-09T10:21:30.933 回答
0

将日期选择器添加到 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)

}
于 2020-02-06T08:14:42.760 回答