滚动存储在 NSUserDefault 中的 UITextField 上的 UITableView 更改数据

Posted

技术标签:

【中文标题】滚动存储在 NSUserDefault 中的 UITextField 上的 UITableView 更改数据【英文标题】:Scroll UITableView change data on UITextField stored in NSUserDefault 【发布时间】:2012-02-13 22:46:11 【问题描述】:

我每行都有一个带有 TextField 的 TableView。 TableView 由两部分组成。 当用户点击键盘的返回按钮时,我在 NSUserDefault 上设置了 TextField 的文本。 在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】:

数据发生变化的原因是,当您将 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 上使用标签来标识哪个字段。

【讨论】:

以上是关于滚动存储在 NSUserDefault 中的 UITextField 上的 UITableView 更改数据的主要内容,如果未能解决你的问题,请参考以下文章

NSUrl 未在 NSUserDefault 中存储为绝对字符串

使用NSUserDefault存储大量数据有啥缺点

在 NSUserDefault 中保存日期会给出不正确的值

iOS 中 关于 NSUserDefault中存储可变数组的问题

NSUserDefault存储类

为啥不建议使用NSUserDefault存储大量数据