2012-02-13 10 views
0

各行にTextFieldを持つTableViewがあります。 TableViewは2つのセクションで構成されています。 ユーザーがKeyBoardの戻るボタンをタップすると、NSUserDefaultでTextFieldのテキストを設定します。 cellForRowAtIndexPathメソッドでは、私はNSUserDefaultのテキストの値を読み取りました。 TableViewをスクロールすると、データが変更されるのはなぜですか?スクロールUITableViewはNSUserDefaultに格納されたUITextFieldのデータを変更します。

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上:

cellForRowAtIndexPath

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

おかげで、 アレッサンドロから:

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の値を設定しますイタリア

答えて

0

データが変更される理由は、UITableViewCellsが画面からスクロールすると、UITableViewCellsがデキューされるためです。この時点でデータは消去され、スクロールバックすると、初期値(変更されていない値)でセルが再投入されます。私はそれを修正する方法を知らない、私は今その解決策を探しています。私が見つけたら、私はそれにリンクします。

* EDIT ***ここで[OK]を はあなたが何をすべきかです:

まず、あなたがあなたのViewController UITextFieldDelegateのデリゲートを作成する必要があります。

  • (無効)textFieldDidEndEditing:あなたが実装する必要が続いて(UITextFieldの*)テキストフィールド私の場合は

を、ユーザインタフェースは名前が含まれているコードで動的に行われたので、私はNSMutableDictionaryを持っていますすべてのフィールドのだから私のコードで私は、次の操作を行います。あなたはプロパティは、あなたがあなたのストレージ変数を更新するための別の方法が必要になりますようにテキストフィールドを持っている場合は

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

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

。たとえば、textFieldでタグを使用して、どのフィールドを識別するかを指定します。

関連する問題