地址簿数据持久性?

时间:2013-07-20 21:30:17

标签: ios objective-c cocoa-touch

(故事板图片) http://i.stack.imgur.com/DUZ12.png

有3个文本字段,用户输入数据并保存。打开应用程序后,如果有任何保存数据,则先前的输入将显示在文本字段中。问题是,只有一组数据,而它需要是一个包含多个人信息的数组。我想创建一个带有名称单元格的导航控制器,点击它们后会显示相关的联系信息。

viewcontroller.h

   @interface ArchiveViewController : UIViewController
    @property (strong, nonatomic) IBOutlet UITextField *name;
    @property (strong, nonatomic) IBOutlet UITextField *address;
    @property (strong, nonatomic) IBOutlet UITextField *phone;
    @property (strong, nonatomic) NSString *dataFilePath;
    - (IBAction)saveData:(id)sender;
    @end

viewcontroller.m

@interface ArchiveViewController ()

@end

@implementation ArchiveViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
 NSFileManager *filemgr;
 NSString *docsDir;
 NSArray *dirPaths;

 filemgr = [NSFileManager defaultManager];

 // Get the documents directory
 dirPaths = NSSearchPathForDirectoriesInDomains(
   NSDocumentDirectory, NSUserDomainMask, YES);

 docsDir = dirPaths[0];

 // Build the path to the data file
 _dataFilePath = [[NSString alloc] initWithString: [docsDir
        stringByAppendingPathComponent: @"data.archive"]];

 // Check if the file already exists
 if ([filemgr fileExistsAtPath: _dataFilePath])
 {
         NSMutableArray *dataArray;

         dataArray = [NSKeyedUnarchiver
          unarchiveObjectWithFile: _dataFilePath];

         _name.text = dataArray[0];
         _address.text = dataArray[1];
         _phone.text = dataArray[2];
 }

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)saveData:(id)sender {
     NSMutableArray *contactArray;

     contactArray = [[NSMutableArray alloc] init];
     [contactArray addObject:self.name.text];
     [contactArray addObject:self.address.text];
     [contactArray addObject:self.phone.text];
     [NSKeyedArchiver archiveRootObject: 
       contactArray toFile:_dataFilePath];

}
@end

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

不是使用包含3个文本元素的数组并使用NSKeyedArchiver,而是使用包含字典的数组并使用writeToFile:atomically:保存它。这将使用数组作为“条目”列表而不是字段列表,并将数据保存在plist而不是二进制文件中。

现在,当您在数组中读取时,您可以显示条目的表格视图(仅显示名称),然后在显示存档视图时,您将向控制器传递相应的字典。

对于保存,最好使用委托将编辑传递回主控制器。但它也可以直接完成(需要在细节控制器中获得更多知识)或通过通知。