Ячейки iOS UITableView дублируются - PullRequest
0 голосов
/ 19 сентября 2018

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];

    [self.tableView reloadData];

}


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


    EWHInboundCustomAttribute *ca = [visibleCustomAttributes objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        cell.tag=indexPath.row;


    if (ca.CustomControlType == 1) {
        cell.detailTextLabel.hidden=true;
        cell.textLabel.hidden=true;

        UITextField *caTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 185, 30)];

            caTextField.adjustsFontSizeToFitWidth = YES;
            caTextField.textColor = [UIColor blackColor];

            caTextField.placeholder = ca.LabelCaption;
            if (ca.ReadOnly) {
                [caTextField setEnabled: NO];
            } else {
                [caTextField setEnabled: YES];
            }
            caTextField.text=nil;
            caTextField.text=ca.Value;
            caTextField.tag=indexPath.row;

            caTextField.delegate=self;

            [cell.contentView addSubview:caTextField];



    } else if (ca.CustomControlType == 4) {

        cell.detailTextLabel.text=ca.Value;
        cell.textLabel.text=ca.LabelCaption;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    } else {

            cell.detailTextLabel.hidden=true;
            cell.textLabel.hidden=true;
            UITextField *caTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 185, 30)];
            caTextField.adjustsFontSizeToFitWidth = YES;
            caTextField.textColor = [UIColor grayColor];

            caTextField.placeholder = ca.LabelCaption;
            [caTextField setEnabled: NO];
            caTextField.text = ca.Value;

            caTextField.tag=indexPath.row;
            caTextField.delegate=self;
            [cell.contentView addSubview:caTextField];
    }



    return cell;
}

enter image description here

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // unique reuseID
    NSString *cellReuseID = [NSString stringWithFormat:@"%ld_%ld", indexPath.section, indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellReuseID];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellReuseID];
        // do something
    }
    return cell;
}

Надеюсь, это полезно.

0 голосов
/ 20 сентября 2018

Вместо создания поля UIText каждый раз, я бы предложил по крайней мере использовать [UIView viewWithTag:tag] для захвата того же объекта UITextField.

0 голосов
/ 20 сентября 2018

Я бы предложил вам создать собственный подкласс UITableViewCell и поместить туда всю логику, связанную с подпредставлениями.
Далее, чтобы сбросить / очистить ячейку перед повторным использованием - вы должны переопределить функцию prepeareForReuse.

Swift:

override func prepareForReuse() {
    super.prepareForReuse()

    //set cell to initial state here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...