Прокрутите данные изменения UITableView на UITextField, хранящиеся в NSUserDefault - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть TableView с TextField для каждой строки.TableView состоит из двух разделов.Когда пользователь нажимает на кнопку возврата KeyBoard, я устанавливаю текст TextField на NSUserDefault.В методе cellForRowAtIndexPath я прочитал значение текста в NSUserDefault.Почему, когда я прокручиваю TableView, данные изменяются?

Вкл cellForRowAtIndexPath:

static NSString *CellIdentifier = @"Cell";

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

//set cell value from NSArray
if ((indexPath.section) == 0) {
    cell.textLabel.text = [sicurezzaSullaStrada objectAtIndex:indexPath.row];
} else {
    cell.textLabel.text = [infoVeicolo objectAtIndex:indexPath.row];
}


//set TextField value from NSUserDefault
if (indexPath.section == 0) {
    //first section
    if (indexPath.row == 0) {
        TextFieldCell = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 80, 21)];
        TextFieldCell.adjustsFontSizeToFitWidth = YES;
        TextFieldCell.placeholder = @"Enter text";
        TextFieldCell.delegate = self;
        [TextFieldCell setText:[[NSUserDefaults standardUserDefaults] objectForKey:@"stringPesoKg"]];
        cell.accessoryView = TextFieldCell;
        }
    if (indexPath.row == 1) {
        TextFieldCell = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 80, 21)];
        TextFieldCell.adjustsFontSizeToFitWidth = YES;
        TextFieldCell.placeholder = @"Enter Text";
        TextFieldCell.delegate = self;
        [TextFieldCell setText:[[NSUserDefaults standardUserDefaults] objectForKey:@"stringPostiLettoOmologati"]];
       cell.accessoryView = TextFieldCell;
    } else {
    //second section
    if (indexPath.row == 0) {
        //Riga relativa alla Data di immatricolazione
        TextFieldCell = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 80, 21)];
        TextFieldCell.adjustsFontSizeToFitWidth = YES;
        TextFieldCell.placeholder = @"Enter Text";
        TextFieldCell.delegate = self;
        [TextFieldCell setText:[[NSUserDefaults standardUserDefaults] objectForKey:@"stringDataImmatricolazione"]];
        cell.accessoryView = TextFieldCell;
    }

И затем на textFieldDidEndEditing:

if (posizSect == 0) {
    if (posizRow == 0) {
        NSUserDefaults *stringDefaultPesoKg = [NSUserDefaults standardUserDefaults];
        [stringDefaultPesoKg setObject:textField.text forKey:@"stringPesoKg"];  
    }
    if (posizRow == 1) {
        NSUserDefaults *stringDefaultPostiLettoOmologati = [NSUserDefaults standardUserDefaults];
        [stringDefaultPostiLettoOmologati setObject:textField.text forKey:@"stringPostiLettoOmologati"];  
    }
    if (posizRow == 2) {
        NSUserDefaults *stringDefaultPostiLettoOmologati = [NSUserDefaults standardUserDefaults];
        [stringDefaultPostiLettoOmologati setObject:textField.text forKey:@"stringLunghezzaMax"];  
    } else {
    if (posizRow == 0) {
        NSUserDefaults *stringDefaultPesoKg = [NSUserDefaults standardUserDefaults];
        [stringDefaultPesoKg setObject:textField.text forKey:@"stringDataImmatricolazione"];  
    }

Вкл didSelectRowAtIndexPath: Я установил значения PosizRow и PosizSect:

posizRow = indexPath.row;
posizSect = indexPath.section;

Спасибо, Алессандро из Италии

1 Ответ

0 голосов
/ 24 мая 2012

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

* РЕДАКТИРОВАТЬ *** Хорошо, вот что вы делаете:

Сначалавам нужно сделать ваш ViewController делегатом для UITextFieldDelegate.Затем вам нужно реализовать:

  • (void) textFieldDidEndEditing: (UITextField *) textField

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

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSArray *fields = [editTexts allKeysForObject:textField];

    if(fields.count > 0)
    {
        [clonedItem setValue:textField.text forKey:[fields objectAtIndex:0]];
    }
}

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

...