2015-03-10 2 views
0

У меня есть UITable с ячейками, содержащими UILabel или UITextField. Когда я обновляю текст в одной ячейке, он также обновляет текст в другой ячейке далее в таблице.Дублирование UITextFields в UITableViewCell

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

Это мой код

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

NSString *cellID = [NSString stringWithFormat:@"%@ %ld", @"DataCell_", (long)indexPath.row]; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CheckListCell"]; 

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID] autorelease]; 
} 

id obj = [stories objectAtIndex:indexPath.row]; 

question = (UILabel *)[cell viewWithTag:101]; 
question.text = [obj valueForKey:@"Question"]; 

response = (UITextField *)[cell viewWithTag:102]; //THIS IS GETTING DUPLICATED 
response.placeholder = [obj valueForKey:@"Question"]; 

checklistSwitch = (UISwitch *) [cell viewWithTag:103]; 
cellCheck = cell; 

//ResponseTypes C=Checkbox, R=Radiobox, TF=Textfield, TA=Textarea, N=Number, M=Misc 
if ([[obj valueForKey:@"ResponseType"] isEqualToString:@"C"] || [[obj valueForKey:@"ResponseType"] isEqualToString:@"R"]) { 

    question.hidden = FALSE; 
    response.hidden = TRUE; 
    if ([[obj valueForKey:@"Checked"] boolValue]) 
     cellCheck.accessoryType = UITableViewCellAccessoryCheckmark; 
    else 
     cellCheck.accessoryType = UITableViewCellAccessoryNone; 

} else if ([[obj valueForKey:@"ResponseType"] isEqualToString:@"N"]) { 

    checklistSwitch.hidden = TRUE; 
    question.hidden = TRUE; 
    response.hidden = FALSE; 
    cellCheck.accessoryType = UITableViewCellAccessoryNone; 

} else { 

    checklistSwitch.hidden = TRUE; 
    question.hidden = TRUE; 
    response.hidden = FALSE; 
    cellCheck.accessoryType = UITableViewCellAccessoryNone; 
    [response setKeyboardType:UIKeyboardTypeDefault]; 

} 

return cell; 

} 
+0

где вы назвали перегрузочной TableView? –

+1

Вы не должны вычислять cellID. Цель dequeueReusableCellWithIdentifier - удалить и повторно использовать вашу ячейку. Таким образом, все ячейки должны иметь тот же идентификатор ячейки, который вы настроили в Interface Builder. – faviomob

+0

@ Stonz2, обратите внимание, что при редактировании сообщения вы также [одобрили изменения также] (http://stackoverflow.com/review/spected-edits/7298281). Лично я считаю неправильной грамматику. – gunr2171

ответ

0

Вам необходимо сохранить значения, которые вводятся в поля response, и применять их соответствующим образом к ячейкам по мере их отображения. Например, если пользователь вводит что-то в ячейку a, у вас может быть NSMutableArray, который будет содержать этот ответ в соответствующем индексе.

Затем, когда вы показываете ваши клетки в cellForRowAtIndexPath:

response = (UITextField *)[cell viewWithTag:102]; 
response.placeholder = [obj valueForKey:@"Question"]; 
response.text = responseValues[indexPath.row]; 

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

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

0

Это происходит потому, что ячейка повторного использования из-за которой предыдущее значение UITextfield все еще сохраняется в повторно используемого использовании cell..Make обратного вызова

tableView:didEndDisplayingCell:forRowAtIndexPath:

Это называется так же, как ячейка выходит за пределы видимой области. Попробуйте настроить текст в текстовом поле на нуль или @"" здесь. Должно сработать.

0

Я рекомендую вам подкласс UITableViewCell и рефакторинг кода, как это:

- (void)viewDidLoad { 
    [_tableView registerClass:[YourTableViewCellSubClass class] forCellReuseIdentifier:NSStringFromClass([YourTableViewCellSubClass class])]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    YourTableViewCellSubClass *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([YourTableViewCellSubClass class]) forIndexPath:indexPath]; 
    if (XYZ){ 
     [self configureXYZCell:cell atIndexPath:indexPath]; 
    } 
    if (ABC){ 
     [self configureABCCell:cell atIndexPath:indexPath]; 
    } else { 
     [self configureSomeCell:cell atIndexPath:indexPath]; 
    } 
} 

- (void)configureXYZCell:(YourTableViewCellSubClass *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.label.text = self.datasource[indexPath.row]; 
    cell.textfield.text = ... 
    cell.switch.on = ...  
} 

- (void)configureABCCell:(YourTableViewCellSubClass *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.label = 
    cell.textfield = 
    cell.switch = 
} 

- (void)configureSomeCell:(YourTableViewCellSubClass *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.label = 
    cell.textfield = 
    cell.switch = 
} 
Смежные вопросы