UITextField заполнитель продолжает показываться при нажатии - PullRequest
2 голосов
/ 12 июня 2011

У меня есть табличное представление с 3 рядами. Каждая строка имеет одну и ту же настраиваемую ячейку просмотра таблицы с полем uitext, но свойство заполнителя отличается.

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

    NewDestinationCell *cell = (NewDestinationCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        [cellNib instantiateWithOwner:self options:nil];
        cell = editCell;
        self.editCell = nil;
        cell.detailTextField.delegate = self;
        cell.detailTextField.tag = indexPath.row;
        [cell.detailTextField setInputAccessoryView:keybdToolbar];
    }
    if ([[textFieldStrings objectAtIndex:indexPath.row] length] != 0) 
        cell.detailTextField.text = [textFieldStrings objectAtIndex:indexPath.row];
    return cell;
}

Когда я нажимаю на текстовое поле и вводю некоторый текст, перехожу в другое текстовое поле и затем возвращаюсь к текстовому полю с моим введенным текстом, он стирает то, что я набрал, и вместо него помещает текст заполнителя. Должен ли я реализовать метод commitEditingStyle? Текстовое поле в каждой строке таблицы связано с одним и тем же выходом uitextfield. Может быть поэтому? Вот код, который я использую для обхода трех строк.

- (void)textFieldDidBeginEditing:(UITextField *)textField {
        [textField becomeFirstResponder];
    textField.text = [textFieldStrings objectAtIndex:textField.tag];
    currTextField = textField;
    if (currTextField.tag == [self.tableView numberOfRowsInSection:0]-1) {
        NextButton.enabled = NO;
        PrevButton.enabled = YES;
    }
    if (currTextField.tag == 0) {
        PrevButton.enabled = NO;
        NextButton.enabled = YES;
    }

}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textFieldStrings replaceObjectAtIndex:textField.tag withObject:textField.text];
    [textField resignFirstResponder];
}


- (IBAction)PrevTextField:(id)sender {
    [tableViewCellFields[currTextField.tag-1] becomeFirstResponder];
}

- (IBAction)NextTextField:(id)sender {
    [tableViewCellFields[currTextField.tag+1] becomeFirstResponder];
}

1 Ответ

1 голос
/ 12 июня 2011

По правде говоря, IBOutlet немного сбивает с толку.Но здесь есть некоторые проблемы, одним из которых является повторное использование клеток.

Поскольку ячейки используются повторно, вы не должны полагаться на текст, сохраняющий их значения, а скорее на то, что вы должны хранить то, что набрано в методе textFieldDidEndEditing:.Вести массив для введенных или не введенных значений (используя [NSNull null] singleton).В методе cellForRowAtIndexPath:, если вы видите существующее текстовое значение, установите текстовое поле текста на это значение.Таким образом, вы можете противостоять эффекту повторного использования ячейки.

Другая проблема связана с выходом StreetName.Когда ячейки будут созданы, я думаю, StreetName будет указывать на правильное текстовое поле, но что произойдет, когда ячейки будут использованы повторно.StreetName будет указывать на текстовое поле последней созданной ячейки, и в результате все присвоения, которые вы делаете в cellForRowAtIndexPath:, являются неправильными для повторно используемых ячеек.Было бы намного проще, если бы вы создали собственный подкласс UITableViewCell, в котором вы будете делать cell.myTextField.text = [textFieldStrings objectAtIndex:indexPath.row];.

В качестве примечания:

StreetName.delegate = self;
StreetName.tag = indexPath.row;
tableViewCellFields[indexPath.row] = StreetName;
[StreetName setInputAccessoryView:keybdToolbar];

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

...