cellForRowAtIndexPath: UILabel перекрывается после прокрутки

cellForRowAtIndexPath:

cell.textLabel.text работает нормально.

После прокрутки UILabel перекрывается. Вот код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; if (cell==nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; // I have tried it by removing views and without. No difference. NSArray *viewsToRemove = [self.tableView subviews]; for (UITableView *table in viewsToRemove) { [table removeFromSuperview]; } } NSManagedObject *managedObject = [newClass objectAtIndex:indexPath.row]; NSString *entityName= [[managedObject entity]name]; cell.textLabel.text = [NSString stringWithFormat:@"%@ %i", entityName, [indexPath row]]; cell.textLabel.font=[UIFont systemFontOfSize:14.0]; NSDate *date = [managedObject valueForKey:@"lastmoddate"]; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"EEE, MMM d, YYYY h:mm a"]; NSString *dateString = [formatter stringFromDate:date]; UILabel *lblDate = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 215, 10)]; lblDate.text = dateString; lblDate.textColor = [UIColor grayColor]; lblDate.font = [UIFont systemFontOfSize:10.0]; [lblDate setBackgroundColor:[UIColor clearColor]]; [cell.contentView addSubview:lblDate]; return cell; } 

Вот изображение:

введите описание изображения здесь

Это то, с чем я столкнулся, и он работает хорошо:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell==nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } NSManagedObject *managedObject = [newClass objectAtIndex:indexPath.row]; NSString *entityName= [[managedObject entity]name]; NSDate *date = [managedObject valueForKey:@"lastmoddate"]; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"EEE h:mm a MMM d, yy'''"]; NSString *dateString = [formatter stringFromDate:date]; UILabel *lblUser = [[UILabel alloc] initWithFrame:CGRectMake(30, 8, 215, 14)]; lblUser.text = [NSString stringWithFormat:@"%@ %i", entityName, [indexPath row]]; lblUser.textColor = [UIColor blackColor]; lblUser.font = [UIFont systemFontOfSize:16.0]; lblUser.tag = 1; [lblUser setBackgroundColor:[UIColor clearColor]]; UILabel *lblDate = [[UILabel alloc] initWithFrame:CGRectMake(30, 21, 215, 20)]; lblDate.text = dateString; lblDate.textColor = [UIColor grayColor]; lblDate.font = [UIFont systemFontOfSize:12.0]; lblDate.tag = 2; [lblDate setBackgroundColor:[UIColor clearColor]]; if ((([cell.contentView viewWithTag:1]) && ([cell.contentView viewWithTag:2]))) { [[cell.contentView viewWithTag:1]removeFromSuperview]; [[cell.contentView viewWithTag:2]removeFromSuperview]; } [cell.contentView addSubview:lblDate]; [cell.contentView addSubview:lblUser]; return cell; } 

dequeueReusableCellWithIdentifier: forIndexPath: гарантированно вернет ячейку (либо новую, либо одну из очереди повторного использования), поэтому предложение if (cell == nil) никогда не будет выполнено – вот почему не имеет значения, действительно ли вы удалите представления или нет. Ярлыки перекрываются, потому что именно так вы его настраиваете. Метка по умолчанию находится в левой части ячейки, а lblDate также находится слева (10 точек слева). Даже если вы переместите lblDate вправо, это может не отображаться, потому что я думаю, что метка по умолчанию имеет полную ширину ячейки. Было бы лучше создать пользовательскую ячейку с двумя ярлыками, которые вы размещаете там, где вы хотите.

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

Попробуй это

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; if (cell==nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; UILabel *lblDate = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 215, 10)]; [cell.contentView addSubview:lblDate]; } NSManagedObject *managedObject = [newClass objectAtIndex:indexPath.row]; NSString *entityName= [[managedObject entity]name]; cell.textLabel.text = [NSString stringWithFormat:@"%@ %i", entityName, [indexPath row]]; cell.textLabel.font=[UIFont systemFontOfSize:14.0]; lblDate.text = dateString; lblDate.textColor = [UIColor grayColor]; lblDate.font = [UIFont systemFontOfSize:10.0]; [lblDate setBackgroundColor:[UIColor clearColor]]; NSDate *date = [managedObject valueForKey:@"lastmoddate"]; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"EEE, MMM d, YYYY h:mm a"]; NSString *dateString = [formatter stringFromDate:date]; return cell; } 

Это проблема с воссозданием содержимого ячеек. Попробуйте выполнить следующий сегмент кода.

 for(UIView *view in cell.contentView.subviews){ if ([view isKindOfClass:[UIView class]]) { [view removeFromSuperview]; } } 

Добавьте эту строку:

 [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

До:

 [cell.contentView addSubview:lblDate]; 

Вы правы в написании кода для удаления всего содержимого из подвью ячейки. Но вы написали это в неправильном месте. UITableView 's dequeueReusableCellWithIdentifier вернет вам ячейку после ее выделения и инициализации один раз. Таким образом, код, который вы написали для удаления cell.contentView.subViews , никогда не будет запущен, и вы получите просмотры Overlapped.

Вы можете либо исправить этот код в инструкции else, но я не предпочитаю этого. Зачем выделять и инициализировать все contentView каждый раз, когда UITableView нуждается в ячейке. Скорее я хотел бы создать UILabel один раз и дать ему тег для доступа к нему позже. Как это:

  UILabel *lblDate = nil; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; lblDate = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 215, 10)]; lblDate.textColor = [UIColor grayColor]; lblDate.font = [UIFont systemFontOfSize:10.0]; lblDate.tag = 1; [lblDate setBackgroundColor:[UIColor clearColor]]; [cell.contentView addSubview:lblDate]; } else { //get a reference to the label in the recycled view lblDate = (UILabel *)[cell.contentView viewWithTag:1]; } 

Попробуйте этот код. Ваша проблема будет решена.

 -(NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { return [arrTableData count]; } -(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UILabel *lblName; UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) {cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; lblName = [[[UILabel alloc] initWithFrame:CGRectMake(10, 20, 300, 20.0)] autorelease]; lblName.tag = LBLNAME; lblName.numberOfLines=1; lblName.textAlignment=UITextAlignmentLeft; lblName.font = [UIFont systemFontOfSize:16.0]; lblName.textColor = [UIColor blackColor]; lblName.backgroundColor = [UIColor clearColor]; lblName.autoresizingMask = UIViewAutoresizingFlexibleRightMargin ; [cell.contentView addSubview:lblName]; }else{ lblName = (UILabel *)[cell.contentView viewWithTag:LBLNAME]; } if (arrTableData.count>0) { lblName.text=[NSString stringWithFormat:@"%@",[arrTableData objectAtIndex:indexPath.row]]; } return cell;} 

Попробуй это

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; NSManagedObject *managedObject = [newClass objectAtIndex:indexPath.row]; NSString *entityName= [[managedObject entity]name]; NSDate *date = [managedObject valueForKey:@"lastmoddate"]; NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"EEE h:mm a MMM d, yy'''"]; NSString *dateString = [formatter stringFromDate:date]; UILabel *lblUser = [[UILabel alloc] initWithFrame:CGRectMake(30, 8, 215, 14)]; lblUser.text = [NSString stringWithFormat:@"%@ %i", entityName, [indexPath row]]; lblUser.textColor = [UIColor blackColor]; lblUser.font = [UIFont systemFontOfSize:16.0]; lblUser.tag = 1; [lblUser setBackgroundColor:[UIColor clearColor]]; UILabel *lblDate = [[UILabel alloc] initWithFrame:CGRectMake(30, 21, 215, 20)]; lblDate.text = dateString; lblDate.textColor = [UIColor grayColor]; lblDate.font = [UIFont systemFontOfSize:12.0]; lblDate.tag = 2; [lblDate setBackgroundColor:[UIColor clearColor]]; [cell.contentView addSubview:lblDate]; [cell.contentView addSubview:lblUser]; return cell; } 
 if ([cell.contentView viewWithTag:tagnumber] { [[cell.contentView viewWithTag:tagnumber]removeFromSuperview]; } lblDate.tag = tagnumber; [cell.contentView addSubview:lblDate]; 

этой линии достаточно просто удалить предыдущие подзаголовки тегов и добавить новый subview с тегом .. Спасибо за ваш ответ

В моем случае такая же проблема произошла, выделив tableviewcell в 2 места, один из них выделен в пользовательском классе tableviewcell, а контроллер customview должен быть выделен, после того как я был изменен alllocation, тогда все будет работать нормально.

Interesting Posts

как сделать контроллер повторного использования UIPageViewController похожим на ячейку повторного использования таблицы?

Добавление пользовательских привязок клавиш к XCode

Вложенное сообщение Facebook не отображается правильно в UIWebView

Как вы можете гарантировать, что приложение для хранилища паролей защищено?

Значок изменения цели в XCode

Отправлять локальные уведомления, пока приложение работает в фоновом режиме Swift 2.0

Игнорировать исключения в com.apple.coremedia.networkbuffering

скрыть навигациюБар, не снимая 20-ти высоты

Google Cloud Messaging: не получать предупреждения, когда приложение iOS находится в фоновом режиме

Создание плагина Phonegap / Cordova IOS для запуска видео с помощью AVPlayer

Cant Override UIView.Draw Method

Как изменить цвет оттенка кнопки отмены UISearchBar в iOS7

Преобразование фотографий HEIF в JPEG для загрузки на бэкэнд

DestinationViewController Segue и UINavigationController swift

Сравнение указателей объектов NSNumber, созданных с помощью константных целых чисел

Давайте будем гением компьютера.