【问题标题】:Replace iOS7 Keyboard by a Date Picker in TableViewController用 TableViewController 中的日期选择器替换 iOS7 键盘
【发布时间】:2014-04-22 01:26:35
【问题描述】:

我希望我的文本字段“DateText”用这种类型的值打开一个 DatePicker(年 - 月 - 日):

YYYY-MM-DD

有没有简单的方法可以更换键盘?

【问题讨论】:

    标签: ios uidatepicker


    【解决方案1】:

    您可以使用 UITextField 的 inputView 属性“替换”键盘:

    - (void) initializeTextFieldInputView {
        UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectZero];
        datePicker.datePickerMode = UIDatePickerModeDate;
        [datePicker addTarget:self
                       action:@selector(dateUpdated:)
             forControlEvents:UIControlEventValueChanged];
        self.textField.inputView = datePicker;
    }
    
    - (void) dateUpdated:(UIDatePicker *)datePicker {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd"];
        self.textField.text = [formatter stringFromDate:datePicker.date];
    }
    

    UIDatePickers 没有 UIPickerViews 之类的委托,因此必须像 UIButton 一样添加操作。选择器声明末尾的: 提供了UIDatePicker 以方便获取更改日期。如果不想在方法中发送对象,可以通过引用 UITextField 的 inputView 来获取 UIDatePicker:

    UIDatePicker *datePicker = (UIDatePicker *)self.textField.inputView;
    

    最后,当使用 NSDateFormatter 设置格式时,最好创建一种方法来返回 NSDateFormatter 对象以确保格式一致。至少,在你的项目中创建一个常量/宏来声明格式字符串。

    编辑

    正如 Pavan 在 cmets 线程中询问的那样,如果您想在键盘上方添加一个完成按钮,请使用 inputAccessoryView:

    UIToolbar *toolbar = [[UIToolbar alloc] init];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonWasPressed:)];
    UIBarButtonItem *flexibleSeparator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    toolbar.items = @[flexibleSeparator, doneButton];
    self.textField.inputAccessoryView = toolbar;
    

    编辑 2,SWIFT

    似乎这个答案已经过时了。使用 Swift 3 添加实现:

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.initializeTextFieldInputView()
    }
    
    func initializeTextFieldInputView() {
        // Add date picker
        let datePicker = UIDatePicker()
        datePicker.datePickerMode = .date
        datePicker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
        self.textField.inputView = datePicker
    
        // Add toolbar with done button on the right
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 1))
        let flexibleSeparator = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed(_:)))
        toolbar.items = [flexibleSeparator, doneButton]
        self.textField.inputAccessoryView = toolbar
    }
    
    func dateChanged(_ datePicker: UIDatePicker) {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        self.textField.text = formatter.string(from: datePicker.date)
    }
    

    您也可以通过在 UITextField 中投射 inputView 来获取 UIDatePicker:

    let datePicker = self.textField.inputView as? UIDatePicker
    

    【讨论】:

    • 我把它放在 .m 或 .h 文件中?
    • 您将其放入 .m 文件中,然后在您的 viewDidLoad 方法中调用 [self initializeTextFieldInputView];
    • 非常感谢@Chris Im 从 iOS App Dev 开始,这对我有很大帮助。
    • 克里斯 - 这很有帮助。有没有办法在右上角添加一个完成按钮来关闭日期选择器?
    • 选择日期时设置minuteInterval有什么意义?
    【解决方案2】:

    Swift 2.0

    我发现上面 Chris 的回答很有帮助,但在 Swift 中需要它。

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Present UIDatePicker for date input
        let datePicker = UIDatePicker(frame: CGRectZero)
        datePicker.datePickerMode = .Date
        datePicker.addTarget(self, action: #selector(SettingsViewController.DateChanged), forControlEvents: .ValueChanged)
        self.fromTimeField.inputView = datePicker
    }
    
     func timeChanged(datePicker: UIDatePicker) {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        self.fromTimeField.text = formatter.stringFromDate(datePicker.date)
    

    【讨论】:

      【解决方案3】:

      在创建 TextField 操作时使用 Editing Did Begin 操作启用 UIDatePicker。

      - (IBAction)textFieldAction:(id)sender
      {
          // Place your code for UIDatePicker
          [textField resignFirstResponder]; //add this line in the end.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 2023-03-10
        相关资源
        最近更新 更多