美文网首页
iOS内置存储

iOS内置存储

作者: 小苗晓雪 | 来源:发表于2017-07-09 15:56 被阅读6次
    image.png 效果图 Gif.gif

    模型文件Contact.h

    #import <Foundation/Foundation.h>
    
    @interface Contact : NSObject <NSCoding>
    
    @property (nonatomic, copy) NSString *name;
    
    @property (nonatomic, copy) NSString *mobile;
    
    @end
    
    

    Contact.m

    
    #import "Contact.h"
    
    /**
     *  自定义的模型如何写入文件?!
            通过NSKeyedArchiver
                遵循NSCoding协议
     两个方法:
     1.encodeWithCoder:将一个对象转换成特定的数据流;
     2.initWithCoder:讲一个文件转换成特定的对象;
     */
    
    @implementation Contact
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        self = [super init];
        if (self) {
            _name = [aDecoder decodeObjectForKey:@"name"];
            _mobile = [aDecoder decodeObjectForKey:@"mobile"];
        }
        return self;
    }
    
    
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeObject:_name forKey:@"name"];
        [aCoder encodeObject:_mobile forKey:@"mobile"];
    }
    
    
    @end
    
    

    AddContactViewController.h

    
    #import <UIKit/UIKit.h>
    #import "Contact.h"
    
    @protocol AddContactViewControllerDelegate <NSObject>
    
    @optional
    //添加联系人:
    - (void)onAddContact:(Contact *)contact;
    //取消添加联系人:
    - (void)onCancel;
    
    @end
    
    
    @interface AddContactViewController : UIViewController
    
    @property (nonatomic, assign) id<AddContactViewControllerDelegate> delegate;
    
    @end
    
    

    AddContactViewController.m

    #import "AddContactViewController.h"
    
    @interface AddContactViewController ()
    
    //用户名输入框:
    @property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
    //手机号输入框:
    @property (weak, nonatomic) IBOutlet UITextField *mobileTextField;
    
    @end
    
    @implementation AddContactViewController
    
    #pragma mark - Life Cycle
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.title = @"添加联系人";
    }
    
    
    #pragma mark - 保存
    - (IBAction)onSave:(id)sender
    {
        if ([self.userNameTextField.text length] && [self.mobileTextField.text length])
        {
            //面向模型开发:
            NSString *name = self.userNameTextField.text;
            NSString *mobile = self.mobileTextField.text;
    //        NSDictionary *contact = @{
    //                                  
    //                                  @"name":name,
    //                                  
    //                                  @"mobile":mobile
    //                                  
    //                                  };
            //创建模型:
            Contact *contact = [[Contact alloc] init];
            //给模型的两个属性赋值:
            contact.name = name;
            contact.mobile = mobile;
            //我的代理是上一页(联系人列表页) , 我得把这一页的数据传回上一页去显示在上一页的cell里 , 把name信息存到cell的textLabel上 , 把mobile信息传递到上一页cell的detailTextLabel上;
            if (_delegate && [_delegate respondsToSelector:@selector(onAddContact:)])
            {
                [_delegate onAddContact:contact];
            }
        }
    }
    
    #pragma mark - 取消
    - (IBAction)onCancel:(id)sender {
        //如果我点击的是取消按钮 , 我的代理要实现取消方法 , 让本页回退上一页 , 不带回任何数据;
        if (_delegate && [_delegate respondsToSelector:@selector(onCancel:)])
        {
            [_delegate onCancel];
        }
    }
    
    
    #pragma mark - Memory Warning
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
    }
    
    
    @end
    
    

    ContactListTableViewController.h

    #import <UIKit/UIKit.h>
    
    @interface ContactListTableViewController : UITableViewController
    
    @end
    

    #import "ContactListTableViewController.h"
    #import "AddContactViewController.h"
    
    
    static NSString *const contactReuseIdentifier = @"contactReuseIdentifier";
    
    @interface ContactListTableViewController ()<AddContactViewControllerDelegate>
    
    @property (nonatomic, strong) NSMutableArray *contacts;//数据源数组 ,保存的是存储进来的contact模型;
    
    @end
    
    @implementation ContactListTableViewController
    
    #pragma mark - init
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            _contacts = [NSMutableArray array];
        }
        return self;
    }
    
    #pragma mark - Life Cycle
    - (void)viewDidLoad {
        [super viewDidLoad];
        //设置UI:
        [self setupUI];
        //程序一进来读取一下文件:
        [self read];
        
    }
    
    
    #pragma mark - <UITableViewDataSource>
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.contacts.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:contactReuseIdentifier];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:contactReuseIdentifier];
        }
        //面向模型开发:
        Contact*contact = self.contacts[indexPath.row];
        cell.textLabel.text = contact.name;
        cell.detailTextLabel.text = contact.mobile;
        return cell;
        
    }
    
    #pragma mark - <UITableViewDelegate>
    - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
    {
        return YES;
    }
    
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            [self.contacts removeObjectAtIndex:indexPath.row];
            [self.tableView reloadData];
        }
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    
    
    #pragma mark - setup UI
    - (void)setupUI
    {
        self.title = @"联系人列表";
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"添加"
                                                                                  style:UIBarButtonItemStylePlain
                                                                                 target:self
                                                                                 action:@selector(add:)];
        
    }
    
    - (void)add:(id)sender
    {
        AddContactViewController *addVc = [[AddContactViewController alloc] init];
        addVc.delegate = self;
        [self.navigationController pushViewController:addVc animated:YES];
    }
    
    
    #pragma mark - <AddContactViewControllerDelegate>
    - (void)onAddContact:(Contact *)contact
    {
        //将模型存储到数据源数组:
        [self.contacts addObject:contact];
        [self.tableView reloadData];
        [self.navigationController popViewControllerAnimated:YES];
        //从 第一页(添加联系人页) 回到第二页(联系人列表页)的时候给我把数据源数组添加完contact模型数据后的这个新的数据源数组保存下来 , 保存成一个plist文件 , 这个文件存在于tmp文件夹内;
        [self save];
    }
    
    - (void)onCancel
    {
        //取消添加联系人操作就什么也不做直接回退上一页:
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    
    #pragma mark - 写入文件方法
    - (void)save
    {
        //写入plist文件:
    //    [self.contacts writeToFile:[self filePath] atomically:YES];
        
        //传入一个id对象 , 返回的是NSData对象:
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.contacts];
        //然后把NSData对象写入文件中:
        [data writeToFile:[self filePath] atomically:YES];
        
    }
    
    #pragma mark - 返回文件真实路径方法
    - (NSString *)filePath
    {
        NSString *temp = NSTemporaryDirectory();
        
    //    return [temp stringByAppendingPathComponent:@"contacts.plist"];
        return [temp stringByAppendingPathComponent:@"contacts.archive"];
        
    }
    
    
    #pragma mark - 读取
    - (void)read
    {
    //    NSArray *contacts = [NSArray arrayWithContentsOfFile:[self filePath]];
    //    if (contacts) {
    //        self.contacts = [NSMutableArray arrayWithArray:contacts];
    //    }
        
        NSData *data = [NSData dataWithContentsOfFile:[self filePath]];
        id object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        if ([object isKindOfClass:[NSArray class]]) {
            self.contacts = [NSMutableArray arrayWithArray:object];
        }
        
        
    }
    
    #pragma mark - Memory Warning
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        
    }
    
    
    @end
    
    

    愿编程让这个世界更美好

    相关文章

      网友评论

          本文标题:iOS内置存储

          本文链接:https://www.haomeiwen.com/subject/odashxtx.html