保存UITableView数据?

时间:2013-05-31 18:41:23

标签: ios uitableview save

我正在使用故事板和动态UITableView添加我的单元格,如下所示。我需要知道如何在每个单元格中的UITextField以及UISwitch状态等中保存此文本,因此当我向上和向下滚动时,数据不会丢失。此外,当应用关闭时,我需要它来显示重新打开时输入的数据。我是编程新手,这是我的第一个UItableView项目。编码示例会很棒,请尽可能详细地说明!提前谢谢你!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    // Make cell unselectable and set font.
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13];

if (indexPath.section == 0) {

    UITextField* tf = nil;
    switch ( indexPath.row ) {
        case 0: {
            cell.textLabel.text = @"Name" ;
            tf = nameFieldTextField = [self makeTextField:self.name placeholder:@"John Appleseed"];
            nameFieldTextField.tag = 1;
            [cell addSubview:nameFieldTextField];
            break ;
        }
        case 1: {
            cell.textLabel.text = @"Address" ;
            tf = addressFieldTextField = [self makeTextField:self.address placeholder:@"Street Address"];
            addressFieldTextField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
            [cell addSubview:addressFieldTextField];
            break ;
        }
        case 2: {
            cell.textLabel.text = @"Email" ;
            tf = emailFieldTextField = [self makeTextField:self.email placeholder:@"example@gmail.com"];
            emailFieldTextField.keyboardType = UIKeyboardTypeEmailAddress;
            [cell addSubview:emailFieldTextField];
            break ;
        }
        case 3: {
            cell.textLabel.text = @"Phone" ;
            tf = phoneFieldTextField = [self makeTextField:self.phone placeholder:@"xxx-xxx-xxxx"];
            phoneFieldTextField.keyboardType = UIKeyboardTypePhonePad;
            phoneFieldTextField.tag = 10;
            phoneFieldTextField.text = [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES];
            [cell addSubview:phoneFieldTextField];
            break ;
        }
        case 4: {
            cell.textLabel.text = @"DOB" ;
            tf = dateOfBirthTextField = [self makeTextField:self.dateOfBirth placeholder:@"xx/xx/xxxx"];
            dateOfBirthTextField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
            [cell addSubview:dateOfBirthTextField];
            break ;
        }

    }
    // Textfield dimensions
    tf.frame = CGRectMake(120, 12, 170, 30);

    // Workaround to dismiss keyboard when Done/Return is tapped
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];

6 个答案:

答案 0 :(得分:4)

我认为你可以制作一个模型对象来存储数据。

.h文件

@interface User : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *phone;
@property (nonatomic, copy) NSString *dob;

- (void)save;
+(User *)savedUser; 

.m文件

#define kName    @"Name"
#define kAddress @"Address"
#define kEMail   @"EMail"
#define kPhone   @"Phone"
#define kDOB     @"DOB"

#define kSavedUser @"SavedUser"

@implementation User

- (void)encodeWithCoder:(NSCoder *)encoder{

    [encoder encodeObject:self.name     forKey:kName];
    [encoder encodeObject:self.address  forKey:kAddress];
    [encoder encodeObject:self.email    forKey:kEMail];
    [encoder encodeObject:self.phone    forKey:kPhone];
    [encoder encodeObject:self.dob      forKey:kDOB];

}

- (id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if (self) {
        self.name       = [decoder decodeObjectForKey:kName];
        self.address    = [decoder decodeObjectForKey:kAddress];
        self.email      = [decoder decodeObjectForKey:kEMail];
        self.phone      = [decoder decodeObjectForKey:kPhone];
        self.dob        = [decoder decodeObjectForKey:kDOB];
    }

    return self;
}

#pragma mark - Save

- (void)save{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
    [defaults setObject:data forKey:kSavedUser];
    [defaults synchronize];
}

+(User *)savedUser{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:kSavedUser];
    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

UITableView DataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier
                                                            forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.detailTextField.delegate = self;
    [cell.detailTextField setTag:indexPath.row+1];

    switch (indexPath.row+1) {
        case 1:{
            cell.titleLabel.text = @"Name";
            cell.detailTextField.text = self.user.name;
            break;
        }
        case 2:{
            cell.titleLabel.text = @"Address";
            cell.detailTextField.text = self.user.address;
            break;
        }
        case 3:{
            cell.titleLabel.text = @"EMail";
            cell.detailTextField.text = self.user.email;
            break;
        }
        case 4:{
            cell.titleLabel.text = @"Phone";
            cell.detailTextField.text = self.user.phone;
            break;
        }
        case 5:{
            cell.titleLabel.text = @"D.O.B.";
            cell.detailTextField.text = self.user.dob;
            break;
        }

        default:
            break;
    }

    return cell;
}

解释得太多了。我附上了源代码,看一看。 Source Code

答案 1 :(得分:0)

您需要添加某种持久性。由于您似乎只有非常少量的数据,因此您需要做的是使用NSDictionary的writeToFile:atomically:方法将表中的数据放入NSDictionary对象中。您可以使用NSDictionary的类方法dictionaryWithContentsOfFile:加载数据,将参数作为参数传递到保存图像的位置。

答案 2 :(得分:0)

首先,为了保存您的应用程序中的数据,您可以使用Core Data或NSUserDefaults,NSUserDefaults应该用于保存少量数据,其余使用Core Data(有很多关于核心数据的教程只是google)< / p>

但是你必须重写cellForRowAtIndexPath方法,因为它被错误地实现了。

首先使用dequeueReusableCellWithIdentifier来检查是否已经创建了单元格(也许您已经听说过单元重用,这就是它的完成方式),因为现在您正在为{{1}的每次调用创建一个新单元格调用(每次单元格出现在屏幕上时调用的方法)。

其次,在cellForRowAtIndexPath之后检查方法返回的单元格是否为nil,如果是nil则创建一个新单元格,如果不使用返回的单元格。

第三,创建一个可以有dequeueReusableCellWithIdentifierUITextField的自定义单元格,并在UISwitch中检查cellForRowAtIndexPath的文本,如果为零则设置为如果没有保留占位符,则可以在滚动表格时正确显示数据。

第四,对于UITextField,有用户开始/结束编辑时调用的委托方法,所以你不需要添加UITextFields,检查UITextFieldDelegate协议(简单的google东西:))

第五个(我承诺的最后一个)不要在同一行代码中使用[tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];,它很丑陋且难以阅读(=

答案 3 :(得分:0)

您可以将数据保存在sqlite数据库中。或者您可以在视图中执行一个数组加载。最初您将插入空值。一旦您将从该uitableviewcell对象替换该空对象,您的单元格将被创建。然后下一个您将加载单元格的时间。您可以直接从该数组中获取数据。

答案 4 :(得分:0)

有关示例代码,请查看GitHub上"Settings" example project库中的TLIndexPathTools。它演示了如何从表中获取用户输入。它还显示了如何向表中添加动态行为,例如在输入更改时隐藏和显示行。

它没有显示如何在应用会话中保留值。有关核心数据或NSUserDefaults的建议,请查看@ d4Rk。

答案 5 :(得分:0)

    nsmutablearray *arr=[[nsmutablearray alloc] init];
    [arr addobject:[nsnull class]];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:customCellIdentifier];
                cell = [[[NSBundle mainBundle]loadNibNamed:@"cell" owner:self options:nil]objectAtIndex:0];
                cell.selectionStyle=UITableViewCellSelectionStyleNone;
                if (![[saveCellState objectAtIndex:indexPath.row] isKindOfClass:[NSNull class]])
                {
                    cell=(UITableViewCell *)[saveCellState objectAtIndex:indexPath.row];
                }
                if ([[saveCellState objectAtIndex:indexPath.row] isKindOfClass:[NSNull class]])
                {
}