Ваше решение кажется странным.Филипе прав, что правильный способ сделать это - [wordsTableView reloadData]
, что вызовет tableView:cellForRowAtIndexPath:
для каждой видимой ячейки.Этот метод также вызывается при прокрутке таблицы, поэтому, если reloadData не работает, вы, вероятно, также столкнетесь с ошибками с данными, которые не обновляются корректно при изменении и прокрутке.В вашем методе clearValues вы делаете то же самое, вызывая tableView:cellForRowAtIndexPath:
.
. Я думаю, что настоящая проблема заключается в вашей tableView:cellForRowAtIndexPath:
реализации.Этот метод обычно имеет 2 раздела.Сначала вы создаете или перерабатываете ячейку, чтобы получить ссылку с чем-то вроде:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
}
Внутри этого оператора, как правило, единственное место, где вы должны добавлять подпредставления в свою ячейку.Если dequeueReusableCellWithIdentifier:
возвращает ячейку, у нее уже должно быть подпредставление.
Затем, после этого оператора if, вы заполняете или обновляете содержимое подпредставлений.Проблема с вашим исходным кодом заключается в том, что он заполняет текстовое поле и добавляет его как подпредставление, предполагая, что в ячейке еще нет текстового поля.Таким образом, ваш tableView:cellForRowAtIndexPath:
должен выглядеть примерно так:
int textFieldTag = 100;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(158, 6, 148, 24)];
[textField setTag:textFieldTag];
[textField setDelegate:self];
[cell addSubview:textField];
[textField release];
}
UITextField *textField = [cell viewWithTag:textFieldTag];
NSString *strReplacement = [valueArray objectAtIndex:indexPath.row];
if (([strReplacement length] != 0) {
textField.text = strReplacement;
} else {
textField.placeholder = @"Add Value";
}
Похоже, вы можете установить значение тега textField на номер строки, предположительно, чтобы вы могли использовать его в UITextFieldDelegate.Это также может привести к ошибкам, так как если ячейка из строки 1 будет переработана на dequeueReusableCellWithIdentifier:
и станет строкой 12, у нее будет неожиданное значение тега.Даже если этого не произойдет сейчас, это ошибка, ожидающая своего появления, и ее сложно будет устранить.