2013-10-04 6 views
0

У меня есть tableView и detailView, где пользователь может изменить данные. Он отлично работал, пока я программно не изменил ячейки из подзаголовка в обычай. Теперь, когда я редактирую данные, и я возвращаюсь, я вижу, что новые данные перекрывают старый, несмотря на [self.tableView reloadData] в viewDidLoad. Изменение данных работает хорошо, потому что, если я перезапущу приложение, будут отображаться новые данные ,обновить ячейки в пользовательской таблицеView

Также разделительные линии между ячейками не покрывают всю ширину.

Просто чтобы убедиться, что здесь код для пользовательских ячеек:

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

UILabel *mainLabel, *detailLabel, *secondLabel; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

if (!cell) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 5.0, 220.0, 15.0)]; 
// mainLabel.tag = MAINLABEL_TAG; 
mainLabel.font = [UIFont systemFontOfSize:14.0]; 
mainLabel.textAlignment = NSTextAlignmentLeft; 
mainLabel.textColor = [UIColor blackColor]; 
mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
[cell.contentView addSubview:mainLabel]; 

secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 5.0, 200, 15.0)]; 
// secondLabel.tag = MAINLABEL_TAG; 
secondLabel.font = [UIFont systemFontOfSize:10.0]; 
secondLabel.textAlignment = NSTextAlignmentRight; 
secondLabel.textColor = [UIColor whiteColor]; 
secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight; 
[cell.contentView addSubview:secondLabel]; 

detailLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 20.0, 220.0, 25.0)]; 
// detailLabel.tag = SECONDLABEL_TAG; 
detailLabel.font = [UIFont systemFontOfSize:12.0]; 
detailLabel.textAlignment = NSTextAlignmentLeft; 
detailLabel.textColor = [UIColor lightGrayColor]; 
detailLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |  UIViewAutoresizingFlexibleHeight; 
[cell.contentView addSubview:detailLabel]; 


SNMGps *aCell = [arrayOfCell objectAtIndex:indexPath.row]; 
mainLabel.text = [NSString stringWithFormat:@"%@", aCell.name]; 
secondLabel.text = [NSString stringWithFormat:@"%d",aCell.gpsID]; 
detailLabel.text = [NSString stringWithFormat:@"%@",aCell.notes]; 
return cell; 

}

Спасибо.

+0

Не могли бы вы объяснить лучше, вы тоже видите родные метки? как для разделителя, вы строите на iOS 7? – shannoga

+0

'reloadData' в' viewDidLoad' не будет полезен, попробуйте поместить его в 'viewWillAppear', как сказал Вирус. – Zaphod

+0

@shannoga Да, я тоже вижу старые ярлыки и да, я строю в IOS7. Сепаратор показывает короткое время, а не только при редактировании записи. – Irene

ответ

0

Вам необходимо перезагрузить табличное представление в viewWillAppear.

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

Спасибо, Вирусс, я пробую это, но результат тот же. – Irene

+1

'reloadData' does * not * (обязательно) триггер перерисовывает на представлениях в ячейке таблицы ... – wcochran

0

Вы пробовали только перезагрузить строки, которые затронуты?

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
+0

Спасибо. Я не уверен, где я должен это поставить, я попытался в viewWillAppear, но это не поможет. – Irene

+0

Я думаю, что проблема не в reloadData или что-то в этом роде. Проблема в том, что UITableViewCells повторно используются. Когда вы показываете один, вы добавляете subviews. Затем ячейки будут иметь добавленные подпункты, но когда они создадут другую, ячейка будет повторно использована, и будет добавлен другой набор подзапросов. Это когда вы получаете текст друг на друга. Вы решили создать свой собственный класс UITableViewCell и добавить туда подпрограммы, а затем редактировать текст. проверьте эту ссылку и посмотрите, как настроить таблицу просмотра таблицы http://www.appcoda.com/customize-table-view-cells-for-uitableview/ – mashdup

0

Возможно, это связано с повторным использованием ячеек. Когда вы повторно используете ячейку, она не новая (поэтому она так быстро, вы не уничтожаете и не воссоздаете ячейку).

Итак, единственное, что вам нужно, в else вашего if (!cell) - удалить все ярлыки в вашей камере, и все будет в порядке!

Например:

if (!cell) { 
    ... 
} 
else { 
    for (int i = cell.contentView.subviews.count -1; i>=0; i--) { 
     UIView * v = [cell.contentView.subviews objectAtIndex:i]; 
     if ([v isKindOfClass:[UILabel class]]) { 
      [v removeFromSuperview]; 
     } 
    } 
} 
+0

Можете ли вы быть более конкретным, я новичок, Я не знаю, что ты имеешь в виду. – Irene

+0

Я добавил пример (из памяти, я не могу проверить его сейчас), но это идея ... – Zaphod

+0

Спасибо за пример, теперь я понимаю лучше. Я попытался, но результат тот же. Я не понимаю, что тот же самый метод отлично работал в стандартном стиле представления, было бы лучше, если бы я сконфигурировал ячейку с раскадрой? – Irene

1

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

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 

//don't forget to end refresh with 
[refreshControl endRefreshing]; 

В отличие от нескольких линий.

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

Смежные вопросы