iPhone在UITextField touch上显示日期选择器

MrH*_*hma 24 iphone protocols datepicker uitextfield

我按照这个帖子:datepicker点击文本字段

我导入了以下两种协议:

@interface ViewController : UIViewController<UIActionSheetDelegate, UITextFieldDelegate> {
Run Code Online (Sandbox Code Playgroud)

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

- (void)viewDidLoad {

    textField.delegate = self;

[super viewDidLoad] }
Run Code Online (Sandbox Code Playgroud)

最后,我将实际代码显示日期选择器(来自线程).我也把它全部联系在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];  
}  
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

我究竟做错了什么?

tom*_*cca 64

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

编辑:代码

textField用IB 拳头连接起来

@interface myViewController <UITextFieldDelegate>
@property (nonatomic,weak) IBOutlet UITextField *myTextField;
@end 
Run Code Online (Sandbox Code Playgroud)

在实施中

UIDatePicker *datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];       
[self.myTextField setInputView:datePicker];
Run Code Online (Sandbox Code Playgroud)

UIDatePicker当你点击它时,这将带来一个textField.请注意我添加到datePicker的操作.

[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 您可以使用a NSDateFormatter来改善字符串的输出.


JRo*_*JRo 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;
}
Run Code Online (Sandbox Code Playgroud)


小智 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)
}
Run Code Online (Sandbox Code Playgroud)