UITextFields в UITableView, введенные значения появляются в других ячейках - PullRequest
5 голосов
/ 29 мая 2011

У меня есть UITableView с около 20 ячеками, в каждой ячейке есть три поля UITextField. Я НЕ создал подкласс UITableViewCell, но при настройке каждой ячейки я установил значение тега textfields в константу плюс номер строки. Таким образом, для каждой строки тег текстового поля увеличивается на единицу.

Когда я запускаю приложение и ввожу значение, например, в первую строку, оно может появиться снова в строке 12. Поведение не всегда одинаково при каждом запуске приложения.

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

Это как-то связано с повторным использованием UITableViewCells? При повторном использовании ячейки могут ли текстовые поля в разных строках получать одинаковые номера тегов? Скажем, например, что первая ячейка (тег textfield = 1001) повторно используется в строке 12, тогда у нас есть два текстовых поля с одинаковым номером тега. Если я затем введу значение в строку 1 и позже загрузлю строку 12, значение из первой ячейки будет загружено из массива и также помещено в строку 12.

Если это происходит, как мне это исправить? Каждая ячейка не имеет ссылки на текстовое поле, поэтому я не думаю, что могу редактировать значение тега текстового поля, просто имея доступ к ячейке, в которой оно находится.

EDIT:

Вот код для UITableView: cellForRowAtIndexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            //Modify cell, adding textfield with row-unique index value
            cell = [self modifyCellForHoleInfo:cell atIndexPath:indexPath];

    }
    cell.accessoryType = UITableViewCellAccessoryNone; 

    // Load value for textfield stored in dataArray
    ((UITextField *)[cell viewWithTag:1000+indexPath.row]).text = [dataArray objectAtIndex:indexPath.row];

Спасибо!

Ответы [ 2 ]

6 голосов
/ 30 мая 2011

Проблема заключается в том, что при повторном использовании ячейки (т. Е. dequeueReusableCellWithIdentifier возвращает не ноль), ячейка возвращается с существующим UITextView. Чтобы сохранить уникальность тегов, лучше удалить все предыдущие UITextField:

- (void)removeExistingTextSubviews:(UITableViewCell *)cell
{
    NSMutableArray *toRemove = [NSMutableArray array];
    // I don't know if you have non-TextField subviews
    for (id view in [cell subviews]) {
        if ([view isKindOfClass:[UITextField class]] && view.tag >= 1000) {
           [toRemove insert:view];
        }
    }

    for (id view in toRemove) {
        [toRemove removeFromSuperView];
    }
}

...

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
} else {
    [self removeExistingTextSubviews:cell];
}
//Modify cell, adding textfield with row-unique index value
cell = [self modifyCellForHoleInfo:cell atIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone; 

// Load value for textfield stored in dataArray
((UITextField *)[cell viewWithTag:1000+indexPath.row]).text = [dataArray objectAtIndex:indexPath.row];

Обратите внимание, что я не скомпилировал код, но он должен послужить отправной точкой.

1 голос
/ 10 января 2015

Просто введите текст текстового поля в словарь setObject по тексту метки и снова проверьте по тексту метки. Присвойте текст соответствующему текстовому полю ... вот мой код ...

//In Interface
NSMutableDictionary *amounts;
amounts =[[NSMutableDictionary alloc]init];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"MoneyEntryIdentifier";
static NSString *CellNib = @"MoneyEntry";
MoneyEntryTableViewCell *cell = (MoneyEntryTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (!cell)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
cell = (MoneyEntryTableViewCell *)[nib objectAtIndex:0];
}

UILabel     *lblname  = (UILabel *)    [cell lblMemName];
lblname.tag =100;
UITextField *txtfield = (UITextField *)[cell textAmount];
txtfield.tag =indexPath.row;

[txtfield addTarget:self  action:@selector(textFieldDidChange:)    forControlEvents:UIControlEventEditingChanged];
lblname.text = tabledata[indexPath.row];
txtfield.placeholder = [NSString stringWithFormat:@"%ld",(long)indexPath.row];


if ([amounts valueForKey:lblname.text] != nil) {
 txtfield.text = [amounts valueForKey:lblname.text];
} else {
 txtfield.text = @"";
}

cell.selectionStyle =UITableViewCellSelectionStyleNone;
return cell;
}

 -(void)textFieldDidChange:(UITextField *)txtField
 {
 UILabel *label = (UILabel *)[txtField.superview viewWithTag:100];
 NSString *labelString = label.text;
 NSString *textFieldString = txtField.text;
 [amounts setObject:textFieldString forKey:labelString];
 }

Измените перо на ячейку таблицы ...

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