target-c: [self.tableview reloadData] перезагружает данные, но не очищает старые ячейки - PullRequest
1 голос
/ 08 февраля 2011

Я работаю над таблицей, и я новичок в динамическом создании ячеек (раньше я создавал их с помощью IB, а затем связывал их с контроллером ячеек и т. Д.).

Все отлично работает, и ожидаемые массивы обновляются должным образом, но когда я запускаю [self.tableview reloadData], программа просто перерисовывает новые значения поверх старых ячеек.например, если в ячейке uilabel есть значение «TEST CELL», когда я обновляю данные до «CELL TEST» и запускаю reloadData, uilabel выглядит так, как будто две метки расположены друг над другом, и оба значения видны.(это похоже на создание двух uilabel с точно таким же местоположением и одинаковым размером и установкой их значений)

и это событие происходит каждый раз, когда я запускаю reloadData, при каждой перезагрузке программа выглядит так, как будто она добавляет еще одну uilabel поверх старойодин.вот мой код:

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
UILabel *lblText1 = [[UILabel alloc] initWithFrame:CGRectMake(30, 5, 130, 30)];
lblText1.adjustsFontSizeToFitWidth = YES;
lblText1.backgroundColor = [UIColor clearColor];
lblText1.text = [lblText1Array objectAtIndex:indexPath.row];
[cell addSubview:lblText1];
[lblText1 release];
if(indexPath.row<3)
{   
    UILabel *lblText2 = [[UILabel alloc] initWithFrame:CGRectMake(170, 5, 130, 30)];
    lblText2.adjustsFontSizeToFitWidth = YES;
    lblText2.backgroundColor = [UIColor clearColor];
    lblText2.text = nil;
    lblText2.text = [spParameters objectAtIndex:indexPath.row];
    [cell addSubview:lblText2];
    [lblText2 release];
}
else if(indexPath.row==3){
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(170, 7, 130, 30)];
    textField.adjustsFontSizeToFitWidth = YES;
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.placeholder = @"please insert value";
    textField.textAlignment = UITextAlignmentCenter;
    textField.delegate = self;
    textField.text = [spParameters objectAtIndex:indexPath.row];
    [cell addSubview:textField];
    [textField release];
}
else if(indexPath.row == 4)
{
    UISwitch *gSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(170, 7, 130, 30)];
    [gSwitch setOn:FALSE];
    [gSwitch addTarget: self action: @selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
    [cell addSubview:gSwitch];
    [gSwitch release];
}
// Configure the cell...
return cell;

}

Я освобождаю компоненты после добавления их в подпредставления, и я думаю о том, что с повторным идентификатором что-то не так ...

Спасибо за помощь.

1 Ответ

1 голос
/ 08 февраля 2011

Похоже, что вы заполняете подробный вид фиксированным числом ячеек, поэтому вам следует рассмотреть возможность создания экземпляров статически, например, в viewDidLoad или в Интерфейсном Разработчике. Вы можете хранить каждую ячейку в отдельной переменной экземпляра и просто возвращать ту, которая соответствует текущей строке каждый раз, когда вызывается tableView:cellForRowAtIndexPath:.

Если вы создаете ячейки программно, добавьте все необходимые подпредставления в это время. В противном случае, как я уже говорил, вы можете сделать это в Интерфейсном Разработчике, который часто упрощает настройку деталей элементов управления, таких как текстовые поля. Обратите внимание, что UITableViewCell уже содержит экземпляр UILabel, поэтому добавление его самостоятельно является излишним. Вместо этого просто получите доступ к свойству textLabel ячейки, чтобы получить ее метку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...