IOS使用NSUserDefault去实现界面传值和数据存储
程序员文章站
2023-12-19 12:58:34
ios使用nsuserdefault去实现界面传值和数据存储
系统单例nsuserdefault的传值
第一界面中
secondviewcontroller...
ios使用nsuserdefault去实现界面传值和数据存储
系统单例nsuserdefault的传值
第一界面中
secondviewcontroller *secondvc = [secondviewcontroller new]; //创建系统单例 nsuserdefaults的实例对象 nsuserdefaults *defaults = [nsuserdefaults standarduserdefaults]; //存值 [defaults setobject:_firsttextfield.text forkey:@"firsttgp"]; nslog(@"%@",defaults); [self.navigationcontroller pushviewcontroller:secondvc animated:yes];
第二界面中
//创建对象来获取存好的数据 nsuserdefaults *defaults = [nsuserdefaults standarduserdefaults]; //接收数据 nsstring *str = [defaults objectforkey:@"firsttgp"]; //赋值到控件 _secondlabel.text = str;
说到单例,这里先说一下自己重写的单例传值的方法.自己重写单例类方法,实现两个页面传值,都是给定的死值.重写单例的原因,是希望在程序的运行期间,他在内存中一直存在,可以随时读取数据
首先创建单例类(datahandle),两种方法
#pragma mark---第一种方法: //创建单例方法使用加号的原因:在创建之前无法存在一个实例对象去调用 +(instancetype)shareddatahandle{ //为了线程安全(添加线程锁) @synchronized(self) { if (!datahandle) { datahandle = [[datahandle alloc]init]; } } return datahandle; }
#pragma mark---第二种方法: +(instancetype)shareddatahandle{ static datahandle *datahandle = nil; static dispatch_once_t oncetoken; dispatch_once(&oncetoken, ^{ datahandle = [[datahandle alloc]init]; }); return datahandle; }
就从后往前传举例,其实从前往后传是同样的道理
第二页面中
self.navigationitem.leftbarbuttonitem = [[uibarbuttonitem alloc]initwithtitle:@"back" style:uibarbuttonitemstyleplain target:self action:@selector(backac)]; datahandle *handle = [datahandle shareddatahandle]; handle.title = @"年薪"; - (void)backac{ [self.navigationcontroller popviewcontrolleranimated:yes]; }
第一页面
- (void)viewwillappear:(bool)animated{//从后往前传时的取值操作 //取值(同样不能写在viewdidload中) datahandle *handle = [datahandle shareddatahandle]; self.firstlabel.text = handle.title; }
嘿嘿,有点跑题了,下边继续说nsuserdefault,接着说nsuserdefault的数据存储
在使用nsuserdefault自定义对象的最初,必须知道可以存哪些类型的数据
1:nsnumber(nsinteger,float,double)
2:nsstring,nsarray,nsdictionary,bool
//使用nsuserdefault进行存储 //1:创建要存储的数组 nsarray *array = @[@"11", @"22",@"33"]; //创建nsuserdefault对象 nsuserdefaults *user = [nsuserdefaults standarduserdefaults]; [user setobject:array forkey:@"userarray"]; nslog(@"%@",user); //读取 nsarray *newarr = [user objectforkey:@"userarray"]; nslog(@"%@",newarr);
#warning 注意:对相同的key赋值约等于一次覆盖,要保证每一个key的唯一性 // nsuserdefaults 存储的对象全是不可变的(这一点非常关键,弄错的话程序会出bug),例如,如果我想要存储一个 nsmutablearray 对象,我必须先创建一个不可变数组(nsarray)再将它存入nsuserdefaults中去 nsmutablearray *mutablearray = [nsmutablearray arraywithobjects:@"123",@"234",@"456", nil]; nsarray *array1 = [nsarray arraywitharray:mutablearray]; nsuserdefaults *user2 = [nsuserdefaults standarduserdefaults]; [user2 setobject:array1 forkey:@"我们这里存放的一定是不可变的"]; // 取出数据是一样的,想要用nsuserdefaults中的数据给可变数组赋值 /*-------------- 错误方法 --------------*/ // nsmutablearray *mutablearray = [user objectforkey:@"我们这里存放的一定是不可变的"]; // //这样写后,mutablearray 就变成了不可变数组了,如果你要在数组中添加或删除数据就会出现bug // nslog(@"%@",mutablearray); /*------ 正确 --------*/ nsmutablearray *mutablearray = [nsmutablearray arraywitharray:[user2 objectforkey:@"我们这里存放的一定是不可变的"]]; nslog(@"%@",mutablearray);
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!