2016-05-18 2 views
0

У меня есть edittext в моей ячейке. Когда я просматриваю или прокручиваю вниз, он устанавливает значение первой ячейки для последней ячейки и второй последней ячейки. Я думаю, что это потому, что он деактивирует ячейку, но я не могу решить эту проблему. Вот мой код для ячейки:iOS: значения повторения UItableview на dequeueReusableCellWithIdentifier

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    _myTableView = tableView; 
    AddTaskTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"addTaskCell" forIndexPath:indexPath]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    AddTaskDetails *task =[self.tasksArray objectAtIndex:indexPath.row]; 
    cell.addHours.delegate = self; 
    cell.taskDetails.text =task.taskName; 
    _hoursTextField = cell.addHours; 
    _hoursTextField.delegate = self; 
    cell.addHours.tag = indexPath.row; 
    cell.addDescriptionBtn.tag = indexPath.row; 
    [cell.addDescriptionBtn addTarget:self action:@selector(didTapAddDescButton:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.addHours addTarget:self action:@selector(editStart:) forControlEvents:UIControlEventEditingDidBegin]; 
    [cell.addHours addTarget:self action:@selector(editEnd:) forControlEvents:UIControlEventEditingDidEnd]; 
    [cell.addHours addTarget:self 
        action:@selector(textFieldDidChange:) 
     forControlEvents:UIControlEventEditingChanged]; 
    if(task.isTextRed) 
    { 
     cell.taskDetails.textColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1.0]; 
     cell.addHours.textColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1.0]; 
    } 
    else 
    { 
     cell.taskDetails.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]; 
     cell.addHours.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]; 

    } 
    if(task.isBillable) 
    { 
     cell.backgroundColor = [UIColor whiteColor]; 
    } 
    else 
    { 
     cell.backgroundColor = [UIColor lightGrayColor]; 
    } 
    AddTaskDetails *task_1 =[self.tasksArray objectAtIndex:indexPath.row]; 
    if(task_1.hours>0) 
    { 
     NSString *hours = [[NSString alloc]initWithFormat:@"%d",task_1.hours]; 
     cell.addHours.text = hours; 
    } 
    else 
    { 
     cell.addHours.placeholder = @"0"; 
    } 
    NSString *hours = [[NSString alloc]initWithFormat:@"Total Hours: %ld",_totalHours]; 
    if(_totalHours<=24) 
    { 
     _labelTotalHours.text = hours; 
    } 
    return cell; 
} 

Этот снимок экрана с правильными значениями:

Correct Image

В этой картинке 4 неверен значение, которое присваивается автоматически, это значение также не массив.

Wrong Image

+0

У вас есть случай, в котором вы не (пере) установить текст ярлыка. Используйте отладчик для прокрутки и поиска. Или используйте инструкции 'NSLog()', так как точки останова не совпадают со временем, особенно при прокрутке. – Avi

+0

Я использовал 'NSLog()' и проверял значения массива, Array имеет правильные значения, но когда я просматриваю вверх/вниз или перезагружаю представление таблицы, он устанавливает неправильные значения (массив имеет правильные значения). –

ответ

2

Просто краткий обзор, поэтому вы получите ваш ответ

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

Итак, теперь, приходя к вашему ответу

в методе cellForRowAtIndexPath -

Всегда сбросить значения для каждого индекса:

Для отл. если у вас есть ярлык UILabel в вашей ячейке, то, установив его внутри cellForRowAtIndexPath, вам нужно будет установить необходимое значение для каждого условия. Если вы хотите, чтобы быть пустым, а затем установить его на «»

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if(today){ 
    label = "today"; 
    } 
    else if(yesterday){ 
    label = "yesterday"; 
    } 
else{ 
    label = ""; **//this is important** 
} 

return cell; 
} 

ВОПРОС В ВАШЕЙ КОД

if(task_1.hours>0) 
    { 
     NSString *hours = [[NSString alloc]initWithFormat:@"%d",task_1.hours]; 
     cell.addHours.text = hours; 
    } 
    else 
    { 
     cell.addHours.text = ""; // YOU NEED TO SET TEXT TO EMPTY AS WELL 
     cell.addHours.placeholder = @"0"; 
    } 
+0

Я делаю это, вот код: 'AddTaskDetails * task_1 = [self.tasksArray objectAtIndex: indexPath.row]; if (task_1.hours> 0) { NSString * hours = [[NSString alloc] initWithFormat: @ "% d", task_1.hours]; cell.addHours.text = hours; } else { cell.addHours.placeholder = @ "0"; } ' –

+0

Обновлен мой ответ, вам нужно будет установить cell.addHours.text =" "; а также, установив placeholder won; t очистите текст –

+0

Это работает Спасибо большое :) –

1
After Declate cell you put below code `if(cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:MyIdentifier] autorelease]; 
} 
else 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:MyIdentifier] autorelease]; 
} 

cell.selectionStyle = UITableViewCellSelectionStyleNone; 

[cell.contentView clearsContextBeforeDrawing];` 
Смежные вопросы