it-swarm.com.ru

выбор даты на экране iPhone на UITextField touch

Я подписался на эту тему: DatePicker, нажав на текстовое поле

Я импортировал оба следующих протокола:

@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, я получаю это:

enter image description here

Что я делаю неправильно?

22
MrHappyAsthma

Вы можете использовать свойство представления ввода 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];       
[self.myTextField setInputView:datePicker];

Это вызовет UIDatePicker, когда вы нажмете на textField. Обратите внимание на действие, которое я добавил в DatePicker.

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

Чтобы обновлять textField каждый раз, когда пользователь прокручивает в средстве выбора, вам просто нужно реализовать метод updateTextField где-нибудь в viewController

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

С помощью этого последнего метода, каждый раз, когда пользователь поворачивает средство выбора, текстовое поле будет обновляться!

  • Вы можете использовать NSDateFormatter для улучшения вывода строки. 
63
tomidelucca

Ниже показано, как я показываю дату выбора.

- (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;
}
12
JRo

Решение @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)
}
3
Natalia Terlecka

Пожалуйста, пройдите этот процессIn .h файл создать объект для UIDatePicker

UIDatePicker *datePicker;

в .m файле viewDidloadMethod

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

Это работает для меня.

0
User558

Хороший подход - создать свой собственный класс (я назвал его TextFieldFormDate), который унаследован от UITextField и инкапсулирует все необходимое поведение. Затем в раскадровке вы устанавливаете класс для текстового поля на TextFieldFormDate (в моем случае).

Используйте didChange и didSelect в вашем ViewController (который использует 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)
    }

}
0
HixField