2013-08-28 4 views
7

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

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; 
} 

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

enter image description here

+0

Вы добавляете новый ярлык каждый раз в свою ячейку. Попробуйте настроить свой текст в свойстве '.detailLabel'. – msgambel

+0

Я использую FPPopOver для iPhone, который не позволяет .detailLabel. Я должен использовать Label. – user1107173

ответ

6

Это то, что я придумал, и это хорошо работает:

- (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; 
} 
+1

Я потратил много времени на поиск решения проблемы, как ваш. Когда init напечатал все было нормально, но когда начало с прокруткой ярлыки были смешаны, их позиции были смешаны. В основном ваше решение очень помогло мне. Спасибо – CroiOS

+0

Рад, что это помогло! – user1107173

2

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

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

2

Попробуйте

- (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; 
} 
+0

+1: Это должно отлично работать –

+0

@KumarKl, нет, это не будет. dequeueReusableCellWithIdentifier: forIndexPath: всегда возвращает ячейку, поэтому предложение if (cell == nil) никогда не будет выполняться, а lblDate никогда не будет добавлен. – rdelmar

+0

@rdelmar его работает для меня. – iAppDeveloper

0

Вы правильно писать код для удаления всего содержимого из подвид клетки. Но вы написали это в неправильном месте. UITableViewdequeueReusableCellWithIdentifier вернет вам ячейку после ее выделения и инициализации один раз. Таким образом, код, который вы написали для удаления 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]; 
    } 
+0

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; всегда возвращает ячейку. Я должен объявить ячейку перед утверждением If. – user1107173

+0

Эй. Мы ищем неполный рабочий день iOS-разработчика для работы в Индии. Частичная занятость будет составлять 10-20 часов в неделю. Дайте мне знать, если вы заинтересованы или хотите кого-то, кого вы знаете. Мы небольшая команда из Сан-Франциско. – user1107173

0

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

-(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;} 
+0

Где находится arrTableData? – user1107173

+0

Его массив данных TableView, содержащий данные, которые будут отображаться в виде таблицы. Вы можете инициализировать его некоторыми объектами в соответствии с вашим требованием и перезагрузить таблицу. – Mahesh

0

Попробуйте эту проблему

- (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; 
} 
2

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

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

    } 
lblDate.tag = tagnumber; 
    [cell.contentView addSubview:lblDate]; 

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

2

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

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

До:

[cell.contentView addSubview:lblDate]; 
0

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

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