UIDatePicker в UITextField в обновлении в реальном времени UITableView - PullRequest
5 голосов
/ 02 июня 2011

Этот вопрос беспокоит меня в последнее время.Любая помощь будет принята.

Это были мои цели:

  1. Настройка UIDatePickerView для UItextField в UITableViewCell.

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

Это то, что я хочу: ** Всякий раз, когда я изменяю значение выбора, мне нужнозначение также будет автоматически изменено в UITextField (который находится в UITableViewCell) **

Это мой код CellForRowIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(110, 10, 185, 30)];
    textField.clearsOnBeginEditing = YES;
    textField.textAlignment = UITextAlignmentRight;

    [cell.contentView addSubview:textField];
     UIDatePicker *datePicker = [[UIDatePicker alloc] init];
        datePicker.datePickerMode = UIDatePickerModeDate;
        [datePicker addTarget:self action:@selector(datePickerValueChangedd:) forControlEvents:UIControlEventValueChanged];
        datePicker.tag = indexPath.row;
        textField.inputView = datePicker;

        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        df.dateStyle = NSDateFormatterMediumStyle;
        NSString *local;
        local = [self datePickerValueChangedd: datePicker];  
        NSLog(@"%@", local); //DISPLAYS OUTPUT ONCE
        textField.text =local;
        [datePicker reloadInputViews];
        [datePicker release];




// Configure the cell...

NSInteger row = [indexPath row];
cell.textLabel.text = [doseInfoDetailsArray objectAtIndex:row];

return cell;
 }

Я также публикую другой код ниже.

- (NSString *)datePickerValueChangedd:(UIDatePicker*) datePicker{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 50, 68, 68)];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
label.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];

NSLog(@"%@", label.text); // DISPLAYS OUTPUT WHENEVER PICKER IS MOVED
doseInfoDetailsTable.reloadData;
return (label.text);
//[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(t) name:TestNotification object:label];
[df release];

}

Вывод отображается правильно.Но мне нужно, чтобы это также изменилось в UITextField.

    2011-06-01 17:32:23.740 Tab[13857:207] Jun 1, 2017
    2011-06-01 17:32:23.740 Tab[13857:207] Jun 1, 2017
    2011-06-01 17:32:25.321 Tab[13857:207] Dec 1, 2017
    2011-06-01 17:44:51.453 Tab[13857:207] Jun 1, 2017
    2011-06-01 17:44:52.605 Tab[13857:207] Jun 1, 2018
    2011-06-01 17:44:53.467 Tab[13857:207] Jun 2, 2018
    2011-06-01 17:44:54.247 Tab[13857:207] Jun 5, 2018

Ответы [ 2 ]

9 голосов
/ 02 июня 2011

Вам не нужно создавать несколько экземпляров UIDatePicker.Нужно сделать.Назначьте его всем текстовым полям.Теперь, чтобы обновить текстовое поле, вам нужно будет определить, какое текстовое поле обновляется.Для этого вы должны принять протокол UITextFieldDelegate и реализовать метод textFieldDidBeginEditing: для установки активного текстового поля.Теперь, когда значение изменяется в экземпляре UIDatePicker, обновите активное текстовое поле.

Но этого, к сожалению, недостаточно.Вы столкнетесь с проблемой повторного использования клеток.Чтобы противостоять этому, вам нужно будет поддерживать массив дат для каждой из ваших строк и обновлять массив каждый раз, когда значение изменяется в экземпляре UIDatePicker.Вы можете определить, к какой ячейке принадлежит текстовое поле, либо tag, вызвав его, либо получив суперпредставление, которое будет экземпляром UITableViewCell, а затем вызвав метод indexPathForCell: для UITableView.

Ина примечании стороны, return (label.text); [df release]; является неправильным, поскольку метод вернется до того, как df будет release d.Вы должны обменять заказ там.

1 голос
/ 07 июня 2011

Это просто продолжение множества комментариев по поводу принятого решения. Спасибо за вашу помощь. Чтобы сделать это, пример кода выглядит следующим образом:

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

    textFieldThatWillBeUpdatedByTheUIDatePicker = (UITextField *)textField;

}

Где textFieldThatWillBeUpdatedByTheUIDatePicker объявлено как UITextField в заголовочном файле.

Наконец, вот метод, который изменяет ячейку:

- (NSString *)datePickerValueChanged:(UIDatePicker*) datePicker{

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    df.dateStyle = NSDateFormatterMediumStyle;

    textFieldThatWillBeUpdatedByTheUIDatePicker.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];

}

Чтобы обработать повторное использование ячейки, сделайте то, что сказал @Deepak в отношении массива, который вы можете использовать в этой строке:

[dateArray replaceObjectAtIndex:textFieldThatWillBeUpdatedByTheUIDatePicker.tag withObject:[NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]]];

Где tag установлен в cellForRowAtIndexPath следующим образом:

textField.tag = indexPath.row;

Я предполагаю, что dateArray предварительно заполнен и до того, как представление таблицы будет вызвано впервые с реальными датами или пустыми значениями. Если вы попытаетесь заменить что-то, чего нет, то оно, очевидно, потерпит неудачу.

Наконец, когда UIDatePicker строится в cellForRowAtIndexPath, включите эту строку для обработки повторного использования ячейки:

textField.text = [dateArray objectAtIndex:indexPath.row];

Первый раз может быть пустым или предварительно заполненным датой.

...