2014-04-22 5 views

Odpowiedz

31

można „wymienić” na klawiaturze za pomocą właściwości inputView z UITextField:

- (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 nie masz delegata takiego UIPickerViews tak dlatego należy dodać działanie, jak gdyby to była UIButton . : na końcu deklaracji selektora udostępnia UIDatePicker jako udogodnienie, aby uzyskać datę, kiedy została zmieniona. Jeśli nie chcesz wysłać przedmiot w tej metodzie można uzyskać UIDatePicker przez odwołanie do UITextField za inputView:

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

Wreszcie podczas ustawiania formatów za pomocą NSDateFormatter jest dobra praktyka, aby utworzyć jedną metodę powrotu jest NSDateFormatter obiekt, aby upewnić się, że format jest spójny. Najpierw utwórz stałą/makro w swoim projekcie, które deklaruje ciąg formatu.

EDIT

Jak poproszony przez Pavan w wątku komentarzach, jeśli chcesz dodać zrobione przycisk powyżej klawiatury, użyj 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; 

EDIT 2 SWIFT

Wydaje się, że ta odpowiedź jest dość nieaktualna. Dodawanie realizację z 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) 
} 

Można również uzyskać UIDatePicker oddając inputView w UITextField:

let datePicker = self.textField.inputView as? UIDatePicker 
+0

To jest prawidłowe rozwiązanie. –

+0

Umieściłem to w pliku .m lub .h? – KevLaBoomQc

+0

Umieszczasz to w pliku .m, a następnie wywołujesz "[self initializeTextFieldInputView];" w swojej metodzie 'viewDidLoad'. – Chris

-1

Włącz UIDatePicker użyciu Montaż zaczęła działanie podczas tworzenia działań TextField.

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

Swift 2,0

znalazłem odpowiedź Chrisa powyżej pomocne, ale potrzebował go w 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)