UILables не обновляется должным образом в UITableViewCell - PullRequest
0 голосов
/ 10 сентября 2010

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

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

Часть кода: (по крайней мере, я думаю, что это важно, поскольку именно здесь создаются ячейки)

Любая помощь приветствуется.Спасибо

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

static NSString *CellIdentifier = @"ContactsDetailCell";


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.

int row = [indexPath row];int section = [indexPath section];

NSDictionary * resultSet = [sqliteManager queryRow: [NSString stringWithFormat: @ "SELECT * ИЗ контактов WHERE id =% d;", ​​contactsId]];

switch (раздел) {case 0: switch (строка) {case 0: cell.textLabel.text = @ "Name:";

UILabel *nameLabel = [[UILabel alloc] initWithFrame: CGRectMake(90, 10, 200, 25)];
  nameLabel.text = [resultSet objectForKey:@"name"];
  nameLabel.textColor = [UIColor blackColor];
  nameLabel.font = [UIFont systemFontOfSize:17.0];
  nameLabel.backgroundColor = [UIColor whiteColor];
  cell.selectionStyle = UITableViewCellSelectionStyleNone;
  [cell.contentView addSubview:nameLabel];
  [nameLabel release];
 break;
case 1:

 cell.textLabel.text = @"Address:";
 cell.selectionStyle = UITableViewCellSelectionStyleNone;

UILabel *addressLabel = [[UILabel alloc] initWithFrame: CGRectMake(90, 10, 200, 25)];

  addressLabel.text = [resultSet objectForKey:@"address"];
  addressLabel.textColor = [UIColor blackColor];
  addressLabel.font = [UIFont systemFontOfSize:17.0];
  addressLabel.backgroundColor = [UIColor whiteColor];
  [cell.contentView addSubview:addressLabel];
 [addressLabel release];
 break;

default:
 break;

} break;по умолчанию: перерыв;

Ответы [ 3 ]

7 голосов
/ 10 сентября 2010

Всякий раз, когда вы вносите изменения в базовый источник данных, вам необходимо обновить табличное представление вручную.Метод reloadData в UITableView - быстрый и неэффективный способ сделать это.Правильный путь:

NSArray *cells = [myTableView visibleCells];
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
for (UITableViewCell *cell in cells) {
    [indexPaths addObject:[myTableView indexPathForCell:cell]];
}
[myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:NO];
[indexPaths release];

Это можно сделать методом viewWillAppear вашего контроллера.

1 голос
/ 10 сентября 2010

Вы можете попробовать добавить этот код в файл реализации основной таблицы:

-(void)viewWillAppear:(BOOL)animated {
[self.tableView reloadData];
[super viewWillAppear:animated];
}

В некоторых случаях это может не сработать, и я решил создать ячейку программно с классом и без кончика;)

Надеюсь, это поможет вам!

1 голос
/ 10 сентября 2010

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

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