Проблемы с прокруткой UITextFields в ячейках в Objective-C для iPhone - PullRequest
0 голосов
/ 22 октября 2010

У меня следующая проблема: у меня есть UITableView с 7 пользовательскими ячейками. Каждая из этих ячеек содержит метку и поле UITextField. Поскольку ячейки несколько большие, вам нужно прокрутить вниз, чтобы увидеть последние 3 ячейки. Проблема в том, что, как только я прокручиваю вниз, текст в текстовых полях первых трех ячеек (тех, которые не видны) удаляется Все, что осталось, это заполнитель. То же самое относится и к последним 3 ячейкам, как только я прокручиваю обратно вверх. Текстовое поле в 4-й ячейке прекрасно сохраняет свой текст, поскольку оно всегда видно. У кого-нибудь есть идеи, как решить эту проблему?

С уважением.

ОБНОВЛЕНИЕ: Вот код для соответствующего комментария:

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

NewXYZTableCell *cell = (NewXYZTableCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil){
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NewXYZTableCell" owner:nil options:nil];

    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[NewXYZTableCell class]])
        {
            cell = (NewXYZTableCell *)currentObject;
            break;
        }
    }
}

switch (indexPath.row) {            
    case 0:
        cell.myLabel.text = @"XYZ";
        // and so on... 
    default:
        break;
}   
return cell;}

Ответы [ 2 ]

1 голос
/ 22 октября 2010

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

И это, вероятно, также то, что происходит с вами.Ваши ячейки прокручиваются за пределы экрана и теперь могут свободно использоваться новыми ячейками, появляющимися на экране (отображая различное содержимое).Таким образом, у вас будет другое название и другое (новое) текстовое поле.Таким образом, вам нужно сохранить свои данные где-нибудь, если ячейка прокручивается за пределы экрана.Например, вы можете слушать UITextFieldTextDidChangeNotification.

Зарегистрируйте свой контроллер в качестве наблюдателя, например, в -viewDidLoad: [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (textFieldChanged :) name: UITextFieldTextDidChangeNotification object: textField]

И затемреализуйте свой метод, в данном случае textFieldChanged:, который принимает NSNotification* в качестве параметра и сохраняет ваш ввод:

-(void)textFieldChanged:(NSNotification *)notification {
    ...
}

Не забудьте повторно вставить вход в ваши ячейки, если они прокручиваются обратноэкран.

Другой вариант - не использовать удаление очереди и создавать все ячейки, как только они понадобятся.Это может быть лучше, если у вас очень мало клеток.Вам нужно позаботиться о том, чтобы вернуть правильную ячейку в -cellForRowAtIndexPath:.

0 голосов
/ 22 октября 2010

Публикация этого ответа как нового, чтобы я мог использовать форматирование кода.

Я предлагаю сохранить семь ячеек в семи переменных экземпляра и создать соответствующие геттеры.Итак, в вашем .h файле вы объявляете переменные:

NewXYZTableCell *cell0;
...
NewXYZTableCell *cell6;

В вашей реализации напишите геттер:

-(NewXYZTableCell*) getCellNumber:(int)cellNumber {
    NewXYZTableCell *cell;
    switch (cellNumber)
    {
        case 0:
            cell = cell0;
            break,

        ...

        case 6:
            cell = cell6;
            break,
    }

    if (cell == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NewXYZTableCell" owner:nil options:nil];

        for(id currentObject in topLevelObjects)
        {
            if([currentObject isKindOfClass:[NewXYZTableCell class]])
            {
                cell = (NewXYZTableCell *)currentObject;
                break;
            }
        }
    }
    return cell;
}

Этот геттер вернет ячейку с соответствующим номером после созданияэто, если бы его не было раньше.Тогда вы можете использовать его в -tableView:cellForRowAtIndexPath::

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return [self getCellNumber:indexpath.row];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...