Очистите все изменения UITextField в UITableView с помощью кнопки UIB - PullRequest
0 голосов
/ 28 марта 2011

У меня есть UITableView с дюжиной строк, каждая из которых содержит UITextField.По умолчанию UITextField содержит значение заполнителя «Добавить значение», если пользователь ранее не редактировал текстовое поле:

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(158, 6, 148, 24)];

NSString *strReplacement = [valueArray objectAtIndex:indexPath.row];

if (([strReplacement length] != 0) {
    textField.text = strReplacement;
} else {
    textField.placeholder = @"Add Value";
}

textField.delegate = self;
[cell addSubview:textField];
[textField release];

Пока все хорошо.

Я также добавил UIButton в нижний колонтитул UITableView.Я хочу очистить все отредактированные значения и обновить все UITextFields в UITableView, когда пользователь щелкает UIButton.

Я могу достаточно легко удалить все объекты из valueArray, но не могу понять, какобновите все ячейки UITableView, чтобы отразить изменения.

Любая помощь приветствуется.LQ

Ответы [ 4 ]

2 голосов
/ 28 марта 2011

Я считаю, что вы ищете

[tableView reloadData];
1 голос
/ 31 марта 2011

Ваше решение кажется странным.Филипе прав, что правильный способ сделать это - [wordsTableView reloadData], что вызовет tableView:cellForRowAtIndexPath: для каждой видимой ячейки.Этот метод также вызывается при прокрутке таблицы, поэтому, если reloadData не работает, вы, вероятно, также столкнетесь с ошибками с данными, которые не обновляются корректно при изменении и прокрутке.В вашем методе clearValues ​​вы делаете то же самое, вызывая tableView:cellForRowAtIndexPath:.

. Я думаю, что настоящая проблема заключается в вашей tableView:cellForRowAtIndexPath: реализации.Этот метод обычно имеет 2 раздела.Сначала вы создаете или перерабатываете ячейку, чтобы получить ссылку с чем-то вроде:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
}

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

Затем, после этого оператора if, вы заполняете или обновляете содержимое подпредставлений.Проблема с вашим исходным кодом заключается в том, что он заполняет текстовое поле и добавляет его как подпредставление, предполагая, что в ячейке еще нет текстового поля.Таким образом, ваш tableView:cellForRowAtIndexPath: должен выглядеть примерно так:

int textFieldTag = 100;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(158, 6, 148, 24)];
    [textField setTag:textFieldTag];
    [textField setDelegate:self];
    [cell addSubview:textField];
    [textField release];
}

UITextField *textField = [cell viewWithTag:textFieldTag];
NSString *strReplacement = [valueArray objectAtIndex:indexPath.row];

if (([strReplacement length] != 0) {
    textField.text = strReplacement;
} else {
    textField.placeholder = @"Add Value";
}

Похоже, вы можете установить значение тега textField на номер строки, предположительно, чтобы вы могли использовать его в UITextFieldDelegate.Это также может привести к ошибкам, так как если ячейка из строки 1 будет переработана на dequeueReusableCellWithIdentifier: и станет строкой 12, у нее будет неожиданное значение тега.Даже если этого не произойдет сейчас, это ошибка, ожидающая своего появления, и ее сложно будет устранить.

0 голосов
/ 28 марта 2011

После нескольких часов проб и ошибок я нашел это решение. Кнопка UIB «Очистить все» вызывает следующий метод:

- (IBAction)clearValues:(id)sender {

    // count the number of values in the array (this is the same as the number of rows in the table)
    int count = [valueArray count];

    // remove all values from the array (deletes any user added values):
    [self.valueArray removeAllObjects];

    UITableViewCell *cell;
    UITextField *textField;

    // loop through each row in the table and put nil in each UITextField:
    for (NSUInteger i = 0; i < count; ++i) {

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        cell = [self.wordsTableView cellForRowAtIndexPath:indexPath];

        // NOTE: Make sure none of your tags are set to 0 since all non-tagged objects are zero.
        // In table construction, your textFieldTags should be: textField.tag=indexPath.row+1;

        textField = (UITextField*)[cell viewWithTag:i+1];
        textField.text = nil;

    }

}
0 голосов
/ 28 марта 2011

Решение Filipe также должно работать, однако следует избегать вызова reloadData везде, где это возможно, так как вызов этого метода приводит к высокой производительности.

Вам нужен некоторый класс, который имеет ссылку как на экземпляр UIButton , так и на все экземпляры UITextField , которые есть на экране / в таблице. Похоже, идеальная работа для вашего UITableView подкласс контроллера!

В приведенном выше коде, почему бы вам также не добавить каждый UITextField , который вы создаете, в NSArray текстовых полей, которые живут в вашем UITableView контроллере ? Затем, когда пользователь нажимает UIButton , действие может вызвать некоторый метод в вашем классе контроллера, который проходит по всем элементам UITextField в NSArray , устанавливая text свойство каждого экземпляра до @"".

Предупреждение. Если вы повторно используете ячейки, возможно, вам необходимо убедиться, что NSArray из контроллера UITextFields контроллера обновляется правильно.

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