2013-08-12 3 views
2

Простая проблема, и я просто не понимаю, как исправить это из того, что там есть, я знаю, что есть много подобных вопросов, извините!UITableView Contents Сброс при прокрутке

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

Это связано с повторным использованием старых ячеек с dequeueReusableCellWithIdentifier справа? Я просто не понимаю, как это исправить!

Вот мой код:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    //Stop repeating cell contents 
    else for (UIView *view in cell.contentView.subviews) [view removeFromSuperview]; 

    //Add cell subviews here... 

} 

Надеется, что вы можете помочь, спасибо.

ответ

3

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

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 


} 

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

Как правило, вся ваша инициализация должна быть в

if (!cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     //ALL INITS 
    } 

и вне его следует обновить значения, которые вы добавили в клетку ..

+0

Хм, я подумал об этом. Просто поместите мой код для добавления subviews внутри оператора if, и теперь моя таблица просто пуста. Почему это так? –

+0

Решил, я использовал идентификатор ячейки, который я использовал в своем раскадровке. Используя уникальный, он добавит subviews, как ожидалось. Благодарю. –

-1

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

+0

Хорошо, это потрясающе, без комментариев. – akdsouza

0

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

Но лучше использовать, когда UITableView Имеют ограниченные ряды (около 50-100 может быть), тогда следующий код полезен в вашем случае. Используйте его, если он вам подходит.

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

    NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) 
    { 
     cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     /// Put your code here. 
    } 

     /// Put your code here. 

    return cell; 
} 

Если у вас есть ограниченные ряды, это лучший код для вас.

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