IOS使用NSUserDefault去实现界面传值和数据存储

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);

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 基于ios逆向过程中lldb调试技巧(推荐)

    假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器.假如你正在使用老一点版本的xcode的话,你又GDB调试器.他们有一些基本的相同的命令,因此假如你的xcode使用的是"(gdb)"提示,而不是"(lldb)"提示的话,你也能够更随一起做,而没有问题. "po"命令是"print object&qu

  • 详解在Vue中如何使用axios跨域访问数据

    最近在项目中需要用到axios,所以就恶补一下这个axios到底是什么东东.越来它是vue-resource的替代品,官网也说了,以后都用axios, vue-resource不在维护.那么这个axios怎么用呢,上网搜索了一大堆,基本上都是雷同,我也不知道那些作者有没有在本地测试过.至少我按照网上的做法,总不能成功.经过几天的奋斗,我终于把它搞清楚了,为了不让其他的小伙伴们走弯路,我把我在实际操作中的例子分享给大家,希望对大家有用. 一.安装axios 老规矩,要想使用axios,我们得安装它

  • ios 贝塞尔曲线切割圆角的方法

    ios 系统框架已经给我们提供了相应的切割圆角的方法, 但是如果在一个见面有很多控件切割的话会出现卡顿和个别不切得现在 /* 创建一个Button */ UIButton * button = [UIButton buttonWithType:(UIButtonTypeSystem)]; [button setFrame:CGRectMake(100, 100, 100, 100)]; [self addSubview:button]; /* 正厂的圆角需求处理方法 */ button.laye

  • iOS11 WKWebView内容过滤规则详解

    WKWebView中新增了一个功能,可以对WebView的内容添加一些自定义的过滤规则.这个功能原来在 Safari Extension 中被引入,从 11 开始同样适用于WKWebView. 使用方法 原理上就是提供一个 JSON 给 WebKit,这个 JSON 包括内容的触发规则(trigger)和对应的处理方式(action).比如: [{ "trigger": { "url-filter": ".*" }, "action&q

  • 详解Linux命令iostat

    Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.在一个以前看到系统监控工具,总在想那些监控工具的代理,如何收集系统性能信息,io性能,cpu使用,带宽使用等信息,偶然发现,不同系统均提供有性能分析工具的,代理可通过这些命令获取系统性能信息,个人猜测,不知道具体是不是这样的.其中iostat可以给我们提供丰富的IO状态数据,下边就来看一下iostat如何使用,命令能够输出那些信息. 简述 Linux系统中通过iostat我们能查看

  • VUE axios发送跨域请求需要注意的问题

    在实际项目中前端使用到vue,后端使用php进行开发.前端使用axios请求请求 关于跨域 跨域的概念这些就不说了,百度一大堆相关的资料信息.我就只在这里记录下我在使用当中遇到的问题,以纪念在逝去的几个小时中资料查找的艰辛. 不多说,直接上代码~~~~ 同理,跨域的解决方案为cros.服务器 PHP端代码如下(laravel 中间件进行处理): public function handle($request, Closure $next) { if ($request->isMethod('OP

  • Vue axios 中提交表单数据(含上传文件)

    我们经常使用表单来上传数据,以及上传文件,那么怎么在表单提交成功的时候接受服务器的响应,并作出相应操作. 当然使用一般jQuery上传对象的格式也是可以的,如果使用传统的表单上传呢? <!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport

  • IOS使用NSUserDefault去实现界面传值和数据存储

    IOS使用NSUserDefault去实现界面传值和数据存储 系统单例NSUserDefault的传值 第一界面中 SecondViewController *secondvc = [SecondViewController new]; //创建系统单例 NSUserDefaults的实例对象 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; //存值 [defaults setObject:_firsttextf

  • iOS高仿微信相册界面翻转过渡动画效果

    点开微信相册的时候,想要在相册图片界面跳转查看点赞和评论时,微信会采用界面翻转的过渡动画来跳转到评论界面,好像是在图片界面的背面一样,点击完成又会翻转回到图片界面,这不同于一般的导航界面滑动动画,觉得很有意思,于是自己学着做了一下,其实也很简单,下面是实现的类似的效果图: 在图片界面点击右下角的查看评论会翻转到评论界面,评论界面点击左上角的返回按钮会反方向翻转回图片界面,真正的实现方法,与传统的导航栏过渡其实只有一行代码的区别,让我们来看看整体的实现. 首先我们实现图片界面,这个界面上有黑色的背

  • iOS新功能引导提示界面实例详解

    在开发中,现在很多app更新了新功能时都会给出用户一个提示,以方便用户更好的体验,那么这个功能如何实现的呢? 首先看下效果图: 1.首先创建第一个viewcontroller 在上面放上一个imageview和一个按钮 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIImageView *imageview=[[UIImageView alloc]ini

  • 微信小程序:数据存储、传值、取值详解

    小程序界面传值 父级界面:A界面 子级界面:B界面 一.url传值 详细的配置参数可以查看组件导航:navigator,这里不再做过多的解释. 1. 正向传值:A界面 –>B界面 用 navigator标签或 wx.navigator传值,A界面向B界面传id值 A界面获取id值传向B界面如果需要传多个参数, 用 & 链接即可 // 方法一:navigator标签传值 <navigator url="/page/index/index?id=110" >传值&

  • IOS 开发之数据存储writeToFile的应用实例

    IOS 开发之数据存储writeToFile的应用实例 最近项目上要弄数据的导入与导出,所以就研究了一下数据的保存,其实很简单  第一步:获得文件即将保存的路径: NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路径.该函数有三个参数

  • IOS 数据存储详解及实例代码

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XML属性列表(plist)归档 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 应用沙盒结构分析: 应用程序包:包含了所有的资源文件和可执行文件 Documents:保存应用运行时生成的需要持久化的数据,iTunes

  • IOS开发之判断两个数组中数据是否相同实例详解

    IOS开发之判断两个数组中数据是否相同实例详解 前言: 工作中遇到的问题,这里记录下,也许能帮助到大家 实例代码: NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", nil nil]; NSArray *array2 = [NSArray arrayWithObjects:@"b", @"a", @"c", nil

  • iOS开发中UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): UIWebView加载内容的三种方式: 1 加载本地数据文件 指定文件的MIMEType 编码格式使用@"UTF-8" 2加载html字符串(可以加载全部或者部分html

  • 详解iOS的数据存储

    iOS应用数据存储的常用方式 1.XML属性列表(plist)归档. 2.Preference(偏好设置). 3.NSKeyedArchiver归档. 4.SQLite3 5.Core Data 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录)与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/Application Support/iPh

  • 在Winform框架界面中改变并存储界面皮肤样式的方法

    在本篇介绍的Winform界面样式改变及存储操作中,是指基于DevExpress进行界面样式的变化.一般情况下,默认我们会为客户提供多种DevExpress的界面皮肤以供个人喜好选择,默认DevExpress提供40余种皮肤样式,用户可以根据自己的喜好,选择较为美观.得体的皮肤,为了方便,我们对用户的皮肤选择进行记录,并可以动态改变. 1.界面皮肤的选择 Winform开发框架(包括混合式Winform开发框架)皮肤如下界面所示. 在皮肤集合中打开,可以看到很多界面皮肤可供选择 上面初始化的皮肤

随机推荐