Возникли проблемы с UITextField и UITableViewCells - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть UITextField в моем UITableViewCell в UITableView. У меня всего 11 клеток. Когда я ввожу текст в ячейку и прокручиваю ячейку за пределами экрана, этот текст очищается.

Кажется, что, может быть, клетки лишены или освобождены. Их всего 11, так что это не слишком большая проблема, но как я могу сделать все ячейки textFields видимыми в этом представлении всегда?

Это код, который я использую. Это потому, что у меня нет источника данных, такого как массив или что-то? Я извлекаю текст изначально из childAppointmentDictionary, если есть текст с сервера, в противном случае пользователь вводит текст, и я сохраняю его в NSString.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CellIdentifier = @"textCell";
    VitalsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    switch (indexPath.row) {
        case 0:
            cell.vitalsLabel.text = @"Temperature";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];
            self.temperatureTextField = cell.textField;
            break;
        case 1:
            cell.vitalsLabel.text = @"Pulse";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"pulse"];
            self.pulseTextField = cell.textField;
            break;
        default:
            break;
    }
    return cell;
}

- (void) textFieldDidEndEditing:(UITextField *)textField{
    if (textField == temperatureTextField){
        self.temperatureString = self.temperatureTextField.text;
    } 
    else if (textField == pulseTextField){
        self.pulseString = self.pulseTextField.text;
    }
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Когда ячейка отключается. Экран всех представлений внутри освобождается из соображений производительности. Он не хранит ваш текст (NSString), и когда ячейка переходит на экран, TableView перерисовывает его, но без текста.

Ваш текст (NSString) должен рассматриваться как ваша модель. Так что в tableView: cellForRow: вам нужно каждый раз устанавливать NSString, которую вы хотите, как текст.

Некоторый код

Ваш подход близок к хорошему, но вам нужно выделить ячейку с помощью cellIdentifier как минимум 1 раз. Я полагаю, что ячейка должна быть разделена на подклассы с использованием текстового поля или подобного, как вы сделали, и использовать dequeueReusableCellWithIdentifier: для извлечения шаблона ячейки из tableView. После того, как вы получили шаблон ячейки, вы можете настроить текст для ваших текстовых полей. Эти текстовые поля заполняются каждый раз, когда tableView: cellForRowAtIndexPath вызывается вашим tableViewDataSource с использованием NSString, хранящегося в вашей модели (NSDictionary в вашем случае). Если вы размещаете в таблице статический номер строки, я предлагаю вам использовать перечисление, чтобы сделать ваш код более читабельным. Я предлагаю также прочитать Пристальный взгляд на ячейки табличного представления . Это очень очень полезно. Надеюсь, что это поможет.

typedef enum {
    kCellRowTemperature = 0,
    kCellRowPulse
} CellRowTAG;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellIdentifier = @"textCell";
    VitalsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[VitalsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    switch (indexPath.row) {
        case kCellRowTemperature:
            cell.vitalsLabel.text = @"Temperature";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];
            self.temperatureTextField = cell.textField;
            break;
        case kCellRowPulse:
            cell.vitalsLabel.text = @"Pulse";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"pulse"];
            self.pulseTextField = cell.textField;
            break;
        default:
            break;
    }
    return cell;
}
0 голосов
/ 24 ноября 2011

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

http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath:

Как указал Габриэле, вам нужно использовать tableView: cellForRow: для замены текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...