保存动态表格视图的文本字段

时间:2014-05-09 20:20:05

标签: ios objective-c uitableview custom-cell

我一直在发布同样的问题,但我似乎无法得到答案,而且我很容易花费30多个小时试图解决这个问题。我会尽可能简单地保持它。我有一个动态的tableview,当" +"按下按钮。每个单元格有6个textFields。我现在的问题是我保存了一个单元格的textFields,它为每个其他单元格加载相同的东西。 (顺便说一句,请忽略动态tableview重用功能)

这是我的代码

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

    ExpandingCell *cell = (ExpandingCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ExpandingCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
        cell.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        cell.clipsToBounds = YES;
    }



    return cell;
}

这是我的单元格类的代码:ExpandingCell.m

- (IBAction)Save:(id)sender
{
    NSString *saveString = Date.text;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:saveString forKey:@"saveString"];
    [defaults synchronize];

    NSString *saveString1 = Course.text;
    NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
    [defaults1 setObject:saveString1 forKey:@"saveString1"];
    [defaults1 synchronize];

    NSString *saveString2 = Score.text;
    NSUserDefaults *defaults2 = [NSUserDefaults standardUserDefaults];
    [defaults2 setObject:saveString2 forKey:@"saveString2"];
    [defaults2 synchronize];

    NSString *saveString3 = Par.text;
    NSUserDefaults *defaults3 = [NSUserDefaults standardUserDefaults];
    [defaults3 setObject:saveString3 forKey:@"saveString3"];
    [defaults3 synchronize];

    NSString *saveString4 = Putts.text;
    NSUserDefaults *defaults4 = [NSUserDefaults standardUserDefaults];
    [defaults4 setObject:saveString4 forKey:@"saveString4"];
    [defaults4 synchronize];

    NSString *saveString5 = GIR.text;
    NSUserDefaults *defaults5 = [NSUserDefaults standardUserDefaults];
    [defaults5 setObject:saveString5 forKey:@"saveString5"];
    [defaults5 synchronize];

}

- (IBAction)Load:(id)sender
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *loadString = [defaults objectForKey:@"saveString"];
    [Date setText:loadString];
    [DateLabel setText:loadString];

    NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
    NSString *loadString1 = [defaults1 objectForKey:@"saveString1"];
    [Course setText:loadString1];
    [CourseLabel setText:loadString1];

    NSUserDefaults *defaults2 = [NSUserDefaults standardUserDefaults];
    NSString *loadString2 = [defaults2 objectForKey:@"saveString2"];
    [Score setText:loadString2];

    NSUserDefaults *defaults3 = [NSUserDefaults standardUserDefaults];
    NSString *loadString3 = [defaults3 objectForKey:@"saveString3"];
    [Par setText:loadString3];

    NSUserDefaults *defaults4 = [NSUserDefaults standardUserDefaults];
    NSString *loadString4 = [defaults4 objectForKey:@"saveString4"];
    [Putts setText:loadString4];

    NSUserDefaults *defaults5 = [NSUserDefaults standardUserDefaults];
    NSString *loadString5 = [defaults5 objectForKey:@"saveString5"];
    [GIR setText:loadString5];
}



- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

请有人为学校项目提供帮助,并且在截止日期前我一直在努力完成它,但我完全不知道如何做到这一点

2 个答案:

答案 0 :(得分:0)

在您的ExpandingCell工具prepareForReuse方法中,清除文字字段。

答案 1 :(得分:0)

细胞立即重置吗?因为如果没有,似乎Zaph是正确的,他们似乎都指向相同的数据。您应该做的是创建某种数组或plist,您可以在其中存储每个单元格的数据,而不是分配和初始化指向相同默认值的数据。你的细胞可以区分,没有办法。每次执行加载/保存操作时,您的数据都会写入同一位置。

NSString *saveString = Date.text;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:saveString forKey:@"saveString"];
[defaults synchronize];

^每次都会覆盖密钥saveString的值,这就是重新加载时加载保存的值的原因。你可以做的是做一些事情:

[defaults setObject:saveString forKey:[NSString stringWithFormat:@"saveString%ld",(long)indexPath.row]];

这将确保每行存在一组唯一键,您可以更改任何其他唯一标识单元格的方法的行值。也许你可以试试这个:

[defaults setObject:saveString forKey:[NSString stringWithFormat:@"saveString1%@",nameOfGolfer]];

最好是创建一个NSDictionary,并插入一个有组织的日期,课程,推杆#和所有爵士乐的数组。

这样,NSDictionary的每个键都包含一个数组,每个数组的键都是高尔夫球手的名字或课程名称。您只需要在组织数据时添加一个级别,它就会起作用。

EDIT1: 如果您这样做,那么您只有一个对象saveString。字典和数组的noob crashcourse的小菜鸟。基本上NSUserDefault实际上只是一个NSDictionary,只能为ONE键分配一个(NS)对象/值/数字/任何东西。普通的NSDictionary不能将对象作为属性,但可以为ONE键提供多个值。因此,您可以添加NSString对象,然后使用键@"stringCatogory1"引用它,但该键只能有一个对象。

我认为NSUserDefaults只是Apple提供的工具,它通过组合数组和字典来让人们在不创建自己的自定义框架的情况下使数据持久化,从而尝试手动保存易失性数据。您基本上只需创建一个plist,并在每次想要更改值时使用nsdictionary对象进行管理,基本上是creating your own custom nsuserdefaults

例如

[defaults setObject:firstName forKey:@"firstName"];
[defaults setObject:lastName forKey:@"lastname"];
[defaults synchronize]; //overwrites previous values saved from previous synch