Использование одного и того же UIDatePicker для двух текстовых полей

У меня есть два текстовых поля: fromdate и todate. Как получить разные даты из одного и того же средства выбора даты. Я попробовал что-то, что закончилось получением одной и той же даты в обоих текстовых полях при изменении даты.

-(IBAction)dateValueChanged:(id)sender
{
        UIDatePicker *picker = (UIDatePicker *)sender;
        NSDate *dateSelected1 = [picker date];
        NSDate *dateSelected2 = [picker date];

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"dd-MM-yyyy"];
        self.fromTextField.text = [dateFormatter stringFromDate:dateSelected1];
       self.toTextField.text = [dateFormatter stringFromDate:dateSelected2];
}

person ichanduu    schedule 03.05.2012    source источник


Ответы (3)


Вы можете реализовать протокол UITextFieldDelegate для обоих методов TextFields textFieldDidBeginEditing:, а также установить свойство tag для каждого TextField, чтобы их было легко идентифицировать...

Затем, когда вызывается textFieldDidBeginEditing:, вы можете прочитать тег текстового поля, которое начало редактирование, и установить его как глобальное значение, чтобы вы могли узнать, какое текстовое поле должно изменить средство выбора даты.. пример:

- (void)textFieldDidBeginEditing:(UITextField *)textField {

     someGlobalNSInteger = textField.tag; //the current text field tag is now globally set

}

-(IBAction)dateValueChanged:(id)sender {
    UIDatePicker *picker = (UIDatePicker *)sender;
    NSDate *dateSelected1 = [picker date];
    //NSDate *dateSelected1 = [picker date];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd-MM-yyyy"];

    //self.fromTextField.text = [dateFormatter stringFromDate:dateSelected1];
    //self.toTextField.text = [dateFormatter stringFromDate:dateSelected2];

    UITextField *activeTextField = (UITextField*)[self viewWithTag:someGlobalNSInteger]; //gets text field what is currently being edited
    [activeTextField setText:[dateFormatter stringFromDate:dateSelected1]];

}

Однако, если вы не разрешаете редактировать текстовое поле (поэтому оно не может вызвать клавиатуру), вам может понадобиться какой-то другой способ выяснить, какое textField должно получить обновленную дату, но я оставлю это вам.

Надеюсь, поможет

person liamnichols    schedule 03.05.2012
comment
textField.tag имеет тип int, и при его назначении NSInteger отображается предупреждение. - person ichanduu; 07.05.2012

Доступен более элегантный способ реализации без UITextFieldDelegate и textFieldDidBeginEditing:

Просто с проверкой firstResponder

- (IBAction)dateValueChanged:(id)sender
{
    NSDate *dateSelected = [picker date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd-MM-yyyy"];

    if ([firstTextField isFirstResponder])
    {
      firstTextField.text = [dateFormatter stringFromDate:dateSelected];
    }
    else if ([self.endTextField isFirstResponder])
    {
        secondTextField.text = [dateFormatter stringFromDate:dateSelected];
    }
}
person accfews    schedule 07.07.2014

Лучший способ добиться этого — использовать свойство inputview, доступное в UITextField. Инициализируйте средство выбора даты один раз, используя Outlet или программирование, и назначьте его как inputView в методе делегата текстового поля «textFieldDidBeginEditing:». Для назначения даты вы можете использовать свою собственную бизнес-логику, прежде чем фактически назначать ввод для текстового поля.

person Tarun    schedule 03.05.2012