2013-09-27 2 views
2

У меня не было этой проблемы с iOS6, но в настоящее время я имею ее с iOS7. У меня есть UITableView, и вы можете видеть 8 ячеек во время загрузки представления. Каждый из них заполняется разными именами и массивами. Если вы прокрутите вниз, следующие две ячейки выглядят хорошо, но все, что прошло, получает текст поверх него; Этот текст является содержимым того, что было в предыдущих ячейках. Таким образом, 10-я ячейка будет иметь то, что было в первой ячейке, а также то, что должно быть в 10-й ячейке, лежащей поверх нее.UILabels в ячейке UITableView накладываются друг на друга в iOS7

Код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"Cell"; 
     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

     if (cell == nil) 
     { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     } 

     //Create Label for Name inside cell 
     UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(7.0, 5.0, 300.0, 30.0)]; 
     [name setText:[self.entriesArray objectAtIndex:indexPath.row]]; 


     //Check to see if current person is a Parent or Child 
     NSString *class = [self.database getCellDataWithMembership:[self.MembershipArray objectAtIndex:indexPath.row] andColIndex:4]; 

     if([class isEqualToString:@"CHILD"]) 
     { 
      name.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f]; 
      name.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];     
     } 

     [cell.contentView addSubview:name]; 
     return cell; 
} 

Мой навык с видом таблицы является времянки в лучшем случае. Я читал много документации и исследований решений, но не смог найти решение. Мне просто кажется странным, что он отлично подходит для iOS6, но не для iOS7.

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

cell.textLabel.text = [self.entriesArray objectAtIndex:indexPath.row]; 

if([class isEqualToString:@"CHILD"]) 
{ 
    cell.textLabel.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f]; 
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0]; 

Если я использую то, что вместо «имени» UILabel действия от первого кодового блока, то он отображает имена совершенно без какого-либо наложения текста, но что становится проблемой это цвет текста. Если они помечены как ДЕТЬ, тогда они должны быть зеленым текстом и жирным шрифтом. Однако, после прокрутки вниз, каждый человек становится зеленым, когда их не должно быть.

Извините за длительный вопрос. Я работаю над этим и ломаю свой мозг вокруг него, и я просто не могу понять это. Любая помощь будет принята с благодарностью.

ответ

-1

Вы можете установить uilabels с помощью указателя размера ios6/7, показанного на экране. Сначала установите общий вид для ios7, изменив значения x, y, width, height, а затем измените значение в ios6/7 delta, чтобы сделать его для ios6 .Надеемся, что вы получите

+0

Извините, но это не имеет ничего общего с моим вопросом. Я знаю, о чем вы говорите, но это не имеет значения. У меня есть ячейки в UITableView, которые в основном повторяются друг с другом. Значения Delta, к сожалению, не исправят это :( – lshaffer

-2

Вы можете изменить данный код.

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; -> UITableViewCell *cell = nil; 
+0

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

+0

. Переход к другому представлению выполняется с помощью модального сегмента, если это добавляет дополнительные сведения – lshaffer

0

В вашем коде метки добавляются в ячейку при вызове метода cellForRowAtIndexPath:. Я имею в виду, что вы добавляете ярлыки много раз. Вы можете удалить ярлык, который был добавлен ранее.

//If label was added with tag = 500, remove it 
for (UIView *sv in cell.contentView.subviews) 
{ 
    if (sv.tag == 500) 
    { 
     [sv removeFromSuperview]; 
    } 
} 

//Create Label for Name inside cell 
UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(7.0, 5.0, 300.0, 30.0)]; 
[name setText:[self.entriesArray objectAtIndex:indexPath.row]]; 
name.tag = 500; 

Однако это решение не является хорошим решением. Я думаю, что создать обычай UITableViewCell - это правильная вещь.

1

Я динамически добавляю объекты UI в ячейки. Как отмечает «caglar», добавление, а затем удаление - это не лучшая практика. Но я тоже это делаю. Способ, которым я собираюсь добавлять в ячейку множество объектов пользовательского интерфейса, каждый раз, когда он отображается, заключается в том, что сначала удаляет все мои подпрограммы. Затем делегат willDisplayCell добавит их обратно. Очевидно, что если вы хотите удалить только определенные виды, вам нужно будет пометить представление и быть более избирательным при удалении. Но вы можете удалить все со следующим.

-(void)tableView:(UITableView *)tableView 
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath { 

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

Просто убедитесь, что вы добавляете/удаляете свои ярлыки в contentView. В iOS7 вы также удалите это, если не будете осторожны.

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

0

Вы можете попробовать этот метод, когда cell является nil, вам нужно creare в UILabel* name, то вы установите name метку с меткой name.tag = 1000, то вы можете получить доступ к этой метки с помощью этого метода UILabel* name = (UILabel*)[cell.contentView viewWithTag:1000];.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     //Create Label for Name inside cell 
     UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(7.0, 5.0, 300.0, 30.0)]; 
     name.tag = 1000; 
     [cell.contentView addSubview:name]; 
    } 

    UILabel* name = (UILabel*)[cell.contentView viewWithTag:1000]; 
    [name setText:[self.entriesArray objectAtIndex:indexPath.row]]; 


    //Check to see if current person is a Parent or Child 
    NSString *class = [self.database getCellDataWithMembership:[self.MembershipArray objectAtIndex:indexPath.row] andColIndex:4]; 

    if([class isEqualToString:@"CHILD"]) 
    { 
     name.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f]; 
     name.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];     
    } 

    return cell; 

}

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