控制器和应用数据存储

1、UINavigationController, 继承UIViewController,UINavigationController以栈的形式保存子控制器

1)把控制器添加到导航控制器栈里有两种方式:

导航控制器 UINavigationController *nav = [[UINavigationController alloc] init];

比如有一个控制器:UIViewController *control = [[UIViewController alloc] init];

第一种方式:[nav addChildViewController:control];

第二种方式:[nav pushViewController:control animated:YES];

2)从导航控制器栈里中移出栈顶的控制器:- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

回到指定的子控制器:- (NSArray *)popToViewController:(UIViewController *)viewController ainimated:(BOOL)animated;

回到根控制器:- (NSArray *)popToRootViewController ainimated:(BOOL)animated;

3)UINavigationItem的属性:

//左上角的返回按钮
@property(nonatomic, retain)  UIBarButtonItem  *backBarButtonItem;

//中间的标题视图
@property(nonatomic, retain)  UIView  *titleView;

//中间的标题文字
@property(nonatomic, copy)  NSString  *title;

//左上角的视图
@property(nonatomic, retain)  UIBarButtonItem  *leftBarButtonItem;

//右上角的视图
@property(nonatomic, retain)  UIBarButtonItem  *rightButtonItem;

2、UIStoryboardSegue : 每个Segue有三个属性:

//唯一标识
@property(nonatomic, readonly)  NSString  *identifier;

//来源控制器
@property(nonatomic, readonly)  id sourceViewController;

//目标控制器
@property(nonatomic, readonly)  id destinationViewController;

执行segue的时候,跳转之前会调用一个方法:- (void)prepareForSegue:(UIStoryboardSegue *)segue  sender:(id)sender;

一般可以在这个方法做一些准备操作,例如给下一个控制器传值

3、ios应用常用的数据的存储方式主要有:

1)、plist (利用xml属性列表归档NSDictionary、NSArray、NSData、NSNumber等系统类型数据)

2)、NSUserDefaults 偏好设置

3)、NSKeydeArchiver归档(一般用来存储自定义对象)

4)、SQLite(关系型数据库,不能直接存储对象,使用sql语句序列化对象存储)

5)、Core Data (对象型数据库,吧内部环境屏蔽)

4、应用程序沙盒(模拟器沙盒大概路径:/Users/tanxiaoming/Library/Developer/CoreSimulator/Devices/......)

每个应用程序都有自己的应用沙盒,用来和其他程序隔离;

沙盒的文件系统目录有三个:Documents、Library(又包含Caches和Preferences)、tmp;

1)、应用程序包包含了所有的资源文件和可执行文件;

2)、Documents保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录;

3)、tmp保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时,不会备份该目录;

4)、Library/Caches 保存应用运行时生成的非重要的需要持久化的数据,iTunes同步设备时不会备份该目录;

5)、Library/Prefences保存应用的所有偏好设置,iTunes同步设备时会备份该目录

获取应用程序沙盒Documents路径方法:

NSString *path1 = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *path2 = [NSHomeDirectoryForUser(nil) stringByAppendingPathComponent:@"Documents"];
    NSString *path3 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"path1 = %@", path1);
    NSLog(@"path2 = %@", path2);
    NSLog(@"path3 = %@", path3);

/*打印结果:
path1 = /Users/tan/Library/Developer/CoreSimulator/Devices/882B50EA-6CCC-4467-85BC-5FF4E22E4028/data/Applications/3D6BB19E-BD7C-4ACF-B56B-F1B94EDB5DEE/Documents
path2 = /Users/tan/Library/Developer/CoreSimulator/Devices/882B50EA-6CCC-4467-85BC-5FF4E22E4028/data/Applications/3D6BB19E-BD7C-4ACF-B56B-F1B94EDB5DEE/Documents
path3 = /Users/tan/Library/Developer/CoreSimulator/Devices/882B50EA-6CCC-4467-85BC-5FF4E22E4028/data/Applications/3D6BB19E-BD7C-4ACF-B56B-F1B94EDB5DEE/Documents

*/

5、应用程序数据存储方式示例代码:

//定义两个属性
@property (weak, nonatomic) IBOutlet UITextField *txtPlist; //输入信息
@property (weak, nonatomic) IBOutlet UILabel *lblPlist; //展示信息

1)、使用plist文件来存储系统类数据

//将字典数据存入*.plist文件中
- (IBAction)savePlist:(id)sender{
    //沙盒Documents文件夹路径 最后那个参数expandTilde代表是否展开完整路径
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"tan.plist"];

    NSDictionary *dic = @{@"msg": self.txtPlist.text};
    //原子的写入文件中
    if ([dic writeToFile:path atomically:YES]){
        self.txtPlist.text = @"保存成功";
    }
    else{
        self.txtPlist.text = @"保存失败";
    }
}

//* 读取数据plist文件数据 */
- (IBAction)readPlist:(id)sender{
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"tan.plist"];
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];
    self.lblPlist.text = [NSString stringWithFormat:@"%@: %@", [[dic allKeys] firstObject], [[dic allValues] lastObject]];
}

2)、使用偏好设置存储

/* 保存数据到用户偏好设置中 */
- (IBAction)saveDataToUserPreference:(id)sender{
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    // 自动帮我们生成一个plist文件存放在偏好设置的文件夹
    [ud setObject:self.txtPlist.text forKey:@"msg"];

    // 同步:把内存中的数据和沙盒同步
    [ud synchronize];
    self.txtPlist.text = @"存储到偏好设置OK";
}

/* 从用户偏好设置中读取数据 */
- (IBAction)readDataByUserPreference:(id)sender{
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    self.lblPlist.text = [ud objectForKey:@"msg"];
}

3)、使用NSKeyedArchiver对自定义对象进行归档, 使用NSKeyedUnarchiver解析归档对象

首先自定义类需要实现NSCoding协议,然后实现方法

- (void)encodeWithCoder:(NSCoder *)aCoder; //定义自定义类哪些属性需要归档,如何归档

- (id)initWithCoder:(NSCoder *)aDecoder; // 定义归档对象解析时哪些属性需要解析,如何解析

如果父类也遵守了NSCoding协议,应该在encodeWithCoder:方法中加上一句:[super encodeWithCode:encode];

确保继承的实例变量也能被编码,即也能被归档

应该在initWithCoder:方法中加上一句:self = [super initWithCoder:decoder];

确保继承的实例变量也能被解码,即也能被恢复

#import <Foundation/Foundation.h>

@interface TanPerson : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *address;

+ (instancetype)tanPersonWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict;

@end

#import "TanPerson.h"

@implementation TanPerson

+ (instancetype)tanPersonWithDict:(NSDictionary *)dict{
    return [[self alloc] initWithDict:dict];
}

- (instancetype)initWithDict:(NSDictionary *)dict{
    if (self = [super init]){
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

/**
 对象归档时调用
 哪些属性需要归档,又如何归档
 */
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:_address forKey:@"tan_address"];
    [aCoder encodeInt:_age forKey:@"age"];
    [aCoder encodeObject:_name forKey:@"tan_name"];
}

/**
 解析对象时调用
 哪些属性需要解析,如何解析
 */
- (id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]){
        _address = [aDecoder decodeObjectForKey:@"tan_address"];
        _age = [aDecoder decodeIntForKey:@"age"];
        _name = [aDecoder decodeObjectForKey:@"tan_name"];
    }
    return self;
}
@end

//控制器内方法

/* NSKeyedArchiver归档 用来存储自定义对象 */
- (IBAction)saveDataToArchiver:(id)sender{
    TanPerson *person = [[TanPerson alloc] init];
    person.age = 25;
    person.address = self.txtPlist.text;
    person.name = @"呼呼";

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"tanPerson.data"];

    if ([NSKeyedArchiver archiveRootObject:person toFile:path]){
        self.txtPlist.text = @"对象归档OK了";
    }
    else{
        self.txtPlist.text = @"对象归档行动失败!";
    }
}

/* 使用NSKeyedUnarchiver解析归档对象 */
- (IBAction)readyDataByArchiver:(id)sender{
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"tanPerson.data"];

    TanPerson *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    self.lblPlist.text = [NSString stringWithFormat:@"name: %@, age: %d, address: %@", person.name, person.age, person.address];
}

时间: 2024-08-28 10:19:56

控制器和应用数据存储的相关文章

01- - -1.获得项目中info.plist文件的内容 2.沙盒的数据存储及读取 3.控制器view的高度和状态栏statusBar的关系 4.[UIScreen mainScreen].applicationFrame的取值 5.按钮的状态 6.错误调试技巧 7.按钮的各种状态设置

1.获得项目中info.plist文件的内容 1> [NSBundle mainBundle].infoDictionary 2> 版本号在info.plist中的key:kCFBundleVersionKey 2.沙盒的数据存储及读取 1> 数据存储: [[NSUserDefaults standardUserDefaults] setObject:version forKey:versionKey]; 存储数据时记得同步一下 [[NSUserDefaults standardUser

【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的添加删除、数据存储等

(1)效果 (2)源代码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,可以直接用代码的push和pop来控制控制器之间的跳转.也可以使用storyboard的segue来:这里又涉及2种,一种是直接用按钮拖拽到另一个控制器形成segue,这种segue不可拦截,如果点击直接跳转.另一种是从一个控制器拖拽到另一个控制器形成的segue,这种segue没有明确的点击谁来跳转,所以有一个performS

iOS数据存储之CoreData

iOS中大量数据的储存一个是SqLite,另一个就是CoreData,CoreData允许程序员以面向对象的思维方式的方法去操作面向表的数据库 做过Java开发的对这个应该很熟悉,Java中的Hibernate跟CoreData就很相似 CoreData应该怎样使用呢? 第一步,新建工程后导入CoreData框架 第二部,创建CoreData的数据模型创建步骤如下 然后给你的model起个名字,创建完成后你会看到一个这个文件(相当于数据库文件) 点击这个文件,然后看下图 点击图中1,新建实体(类

iOS常用的几种数据存储方式

之前由于刚入行不久,对数据持久化不是很了解,尤其是用数据库存储大量数据的操作.经过摸索就在此总结一下,方便以后查阅 下面就简单介绍一下: 1.NSUserDefaults 感觉最常用的小量数据,属性,例如,账号,密码之类的:适合存储轻量级的本地数据 (个人认为这种比较简单) NSUserDefaults支持的数据格式有:NSNumber(Integer.Float.Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型 直接看代码比较容易理解: /

iOS狂暴之路---iOS中应用的数据存储方式解析

一.前言 前面一篇文章中已经介绍了iOS应用中的视图控制器知识点,而本文不会按照常理来介绍View的知识点,而是先介绍iOS中的数据存储知识点,因为关于View的知识点太多了,后面会连续详细介绍一下.这篇先来看一下iOS中的数据存储功能分析.每一个iOS应用和Android应用一样,都有其对应的沙盒存储自己的数据,但是iOS和Android有一个区别就在于没有SD卡的概念了,也就说在iOS中应用的数据只能保存到自己的沙盒中.这也可以看出来iOS为了应用的安全考虑. 在开发Android的时候都知

IOS学习笔记 -- Segue、数据存储、UITabBarController

一. Segue1.Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)每一个Segue对象,都有3个属性1>.唯一标识: @property (nonatomic, readonly) NSString *identifier;2>.来源控制器: @property (nonatomic, readonly) id sourceViewController;3>.目标控制器: @property (nonatomic, read

IOS中数据存储 sqlite3 的应用, 知识点: 数据库句柄 , 单例模式运用, Services服务层,sqlite3_open, sqlite3_exec, sqlite3_prepare_v2,sqlite3_step等等

相比于服务器端的数据存储,IOS中几种数据存储的技术: (1)XML属性列表 -- PList (2)NSKeyedArchiver 归档 (3)Preference(偏好设置) (4)SQLite3 (5)Core Data(以面向对象的方式操作数据库SQLite) 发现用数据库进行数据的存储和缓存,才是王道, 比较有心得的体会:虽然通过文件的方式进行存储,读写速度相对数据库存储较快,但是涉及大批量的数据时,在查询/管理/优化方面,数据库的优势明显会更大些.而且作为移动端,SQLite数据库在

iOS UI基础-13.0 数据存储

应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer) 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/Application Support/iPhone Simulator/6.0/Applications 应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源

项目框架和数据存储

UIWindow和ViewController: window —>JWViewController - 其他的控制器—>view —> btn UIWindow:是个特殊的UIView,通常一个程序只有一个window.可以查看官方文档(有中文版的) addSubView: rootViewController makeKeyWindow  成为主窗口(相应事件) makeKeyAndVisiable  成为主窗口(相应事件)并且显示到用户眼前   singleView  viewco