Значение текстового поля повторяется в UITableView при прокрутке - PullRequest
0 голосов
/ 30 января 2019

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

Это в Objective-C .У меня есть табличное представление, которое имеет динамическое количество строк (пользователь может добавить больше ячеек или удалить ячейки согласно требованию) и каждая строка содержит 3 текстовых поля , и в конце я хочу получить данныеиз этого текстового поля и сохраните их.Получение данных из всех текстовых полей работает отлично, но здесь возникает основная проблема, когда я добавляю данные в любую строку (3 текстовых поля), при повторной прокрутке они повторяются.

Вот код:

-(void)textFieldDidEndEditing:(UITextField *)textField{
    if ([_txtNumbers resignFirstResponder]) {
        totalIndex = [_txtNumbers.text integerValue];
        [_tblContacts reloadData];
    }
}

- (IBAction)onAddCellClicked:(id)sender {
    totalIndex = [_txtNumbers.text integerValue];
    totalIndex = totalIndex + 1;
    _txtNumbers.text = [NSString stringWithFormat:@"%ld",(long)totalIndex];
    [_tblContacts reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return totalIndex;
}

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

    static NSString *CellIdentifier = @"InviteEmailTableViewCell";

    InviteEmailTableViewCell *cell = [self.tblContacts dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.txtName.delegate = self;
    cell.txtTell.delegate = self;
    cell.txtEmail.delegate = self;

    UIToolbar  *numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    [numberToolbar setTintColor:kShadowColor1];
    [numberToolbar setBarTintColor:[UIColor blackColor]];
    numberToolbar.items = [NSArray arrayWithObjects:
                           [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad:)],
                           [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                           [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad:)],
                           nil];
    cell.txtTell.inputAccessoryView = numberToolbar;

    [cell.txtName setTag:indexPath.row];
    [cell.txtTell setTag:indexPath.row];
    [cell.txtEmail setTag:indexPath.row];

    return cell;
}

что делать дальше здесь?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

Your datasource should be responsible for managing the view state.

Как отметил Мехул в своем ответе, сохраните источник данных для хранения текста, набранного в текстовых полях (с помощью тегов текстового поля, так как indexPath.row может быть полезным), и в cellForRowAtIndexPath обновите текст этих текстовых полей, используя ваш источник данных.

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

0 голосов
/ 30 января 2019

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

Решение:

  1. Создайте один массив для хранения данных каждой ячейки / строки(с количеством строк = array.count).
  2. Сохранить делегат каждого текстового поля - для каждого метода текстового поля textFieldDidEndEditing сохранить данные в массиве.
  3. В методе cellForRowAtIndexPath для каждого текстового поля каждой ячейки получить данные из массива для заданногоindexpath и установить соответствующее значение для этого текстового поля.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...