NSUserDefaults 传值方法是系统帮我们封装好的。也是将数据写入到文件中,不需要自己去创建文件。默认在沙盒路径中存储我们的数据
NSUserDefaults传值:
每一个工程在创建之后都有一个默认的沙盒路径。
通过一个页面将数据通过NSUserDefaults的方法写入到沙盒文件中,另一个文件通过沙盒文件读取数据
和单例传值比较接近,比较像,只不过单例是在内存中传值
单例传值:得有个单例对象。所以就要创建一个单例类。单例对象的创建其实就是保证对象在程序运行过程中只有一个。就是说 每次通过类方法调用单例对象的时候都是同一个对象就可以了。
都是同一个对象:那么就必须通过静态变量的方式来进行创建。静态变量一旦被赋值之后,下次再读取的是上一次的值
首先需要有一个类方法。
实现类方法来创建单例对象。
页面传值:
1:属性传值:主要运用于正向传值。不可以进行反向传值。也不能进行跨页面的传值。
2:单例传值:可以实现正向、反向、跨页面传值。数据是写入内存中,然后再从内存中读取数据
不好的点:必须要创建一个单例对象才可以 。创建单例对象需要创建单例类
3:NSUserDefaults传值:与单例传值相像。它是将数据写入沙盒文件中,再从沙盒文件中读取数据
4:代理传值:最经典最常用的传值方式。主要用于反向传值,而且是一对一的,必须要两个页面之间建立代理关系。
5:block传值:代理传值能做的,block传值都能做。也是一对一,页面也要建立关系之后才能传值
6:通知传值:可以进行跨页面之间的传值。多对多的传值方式。发送方发送一个值,任何一个接收方都可以接收。所以接收方接收的通知,可以来自任何发送方
几种常见的页面传值方式:
属性传值:主要用于正向传值,比较简单,过于单一,不能进行反向传值,也不能进行跨页面的传值
单例传值:比较强大,可以实现跨页面,正向反向都可,但是要自己创建一个单例类,将数据写至内存
NSUserDefaults传值:与单例传值较像,但是是将数据写至沙盒文件中,再进行读取数据
代理传值:主要用于反向传值,而且必须为一对一关系传值
block传值:可以做代理传值能做的事,且代码较为简介,但是也是一对一的关系传值
通知传值:可多对多,可跨页面传值,接收方接受的通知可来自于任何一个发送方
通知传值111
block传值
代理页面传值
NSUserDefaults传值
通知传值
我们需要一个发送方和一个接收方
接收方先去监听,模拟从页面2 通过通知的方式传值到页面1,页面1自然就是接收方,那么接收方首先是需要来监听的,我们先看一下,我们需要监听来等待这个消息,所以我们先在页面1 来监听通知,在哪个位置好呢,跳转至页面2之前我们先来做一个监听,还没有到页面2 呢我先来监听页面2 的消息,你什么时候发 ,我这边自然就可以收到了,所以呢,在跳转至页面2之前 添加监听。那么这个监听呢,我们注意一下是通过通知中心的方式也就是说给通知中心就是我们的广播站来添加一个观察者也就是监听者,那我们的通知中心是怎么创建的。
[NSNotificationCenter defaultCenter]addObserver:<#(nonnull id)#> selector:<#(nonnull SEL)#> name:<#(nullable NSNotificationName)#> object:<#(nullable id)#>
这就是我们的通知中心 给他添加一个监听者addObserver就是我们的self我们的接收方,selector是我们接收到通知之后的一个处理
notHandle:带一个参数,参数就是我们的通知。name是什么呢 name就是通知的名字,你要监听哪一个通知,所以呢notify就是通知的名字,
object这个参数填nil就行了,也就是你监听来自哪里的通知,填nil的话表示广播群发的,任何一个发送方只要发送了一个叫notify的通知,我们都可以收到。所以呢我们就添加好了这个观察者了,然后呢我们来实现
notHandle的方法
就是我们收到通知之后的一个处理,那么他需要一个参数就是我们的通知
回到页面2去发通知,在点击回到页面1的时候进行传值,发送通知要通过广播站来发送就是我们的通知中心
协议和block页面传值应用于两个有直接跳转关系的页面之间的传值
通知传值相对来说更灵活 特别是在实现跨页面之间跳转的时候
和我们生活里的通知是一样的,需要有一个发送方和一个接受方,例如广播站,广播员就是我们的发送方他是广播数据的,而接收方就是我们的收音机,是用来接收数据的,发送方和接收方之间如果要进行通讯的话,那么需要一个中间介质,就是我们的通知中心,也就是我们生活里面的广播站,如果没有广播站的话 ,广播员和收音机之间是无法进行通讯的,所以代码里面的通知中心就模拟了广播站的概念,发送方是发送数据 ,接收方是接收数据的,但是在代码里面,我们需要注意的是我们要先在接收方定义一个观察者来等待通知中心发出的消息,那么当他等待之后,发送方将通知发送出去,先发送到通知中心,然后通知中心拿到数据再回调给我们的接收方。这就是通知传值的一个过程。
为什么要先观察后发送呢,其实很简单 ,生活中也是一样
如果广播员先去广播通知,你的收音机还没有打开,当你的收音机打开之后再去监听的话可能已经广播完了,你没有听到,所以如果你想收到广播的通知,那么你必须首先打开收音机监听这段通知,当通知来的时候就可以收到这份通知并且做后续的处理工作,那我们代码也是一样处理的,我们接收方要先观察等待通知中心的消息,然后通知我们的发送方发送了通知,我们的通知中心自然就把消息转播到接收方了。所以这就是通知传值的一个过程
block传值主要应用于反向页面传值,我们需要在第二个页面定义一个block用来传值
定义一个属性 为了防止block的循环引用,block一搬都定义为copy属性
@property (copy) void (^block) (NSString*);也传递一个字符串
返回值类型 block的名字 block的参数 ^block的标志
看到小箭头一定是个block
//定义一个block进行反向传值
一个block定义好了,block写法相对来说麻烦了一些,但是非常好用,建议大家经常去使用block,用多了自然就写熟了
页面2 跳转回页面1 的时候进行传值
直接调用self.block()传值就可以了 他的传值方式 也和C语言一样,可以理解为block就是一个C语言函数,小括号就是C语言里的小括号,小括号里面传递的就是我们的实参
//block传值--反向传值
self.block(self.textField.text);
回到页面1 如何来接收这个block呢,block不像协议 实现协议方法就可以了,block需要实现的话 它是一个对象的属性,我们要向实现block就是实现这个对象的属性,所以我们在创建页面2 的时候,我们就要实现这个block.
一面传值 一面接收值
block传值
苹果最推荐也是目前最为流行的一种传值方式,它和代理传值做着一样的工作,代理传值能做的工作block都能做,他比代理传值写法更简单更容易理解一些,这是近两年苹果主推的一种传值的方式。
页面1跳转到页面2 页面2回调block进行传值
页面1只需要实现block接收数据就可以了
简单在不需要设置代理也不需要定义一个协议
代理传值的整个过程。
代理传值主要是反向传,那么反向传我们从页面2将值传递到页面1 ,页面2 就是我们的委托方,委托方是持有协议并且调用协议方法,而且我们的协议也是定义在委托方的,首先来看一下协议怎么定义,
@protocol passValueDelegate <NSObject>
一个传值的这么一个代理
定义一个方法,这个方法有一个参数也就是我们要传递的值,那看你传什么值了,如果是字符串就定义一个字符串,如果是某一个类的对象那你就定义一个对象就行了,我们用字符串来演示一下.
//委托方-创建一个协议
@protocol passValueDelegate <NSObject>
//协议定义一个传值的方法
-(void)passValue:(NSString*)str;
@end
协议创建好了
那么委托方需要做的事情就是持有协议、然后呢再去调用协议方法传值就可以了
所以呢我们要持有协议的话我们需要一个weak id指针 一个id指针他是持有协议的,持有协议怎么来表现呢尖括号里面写上协议的名字就可以了,
这就是定义一个id指针,它呢持有了协议,指针的名字就叫delegate,指针的名字可以自己来取,代理呢为了防止循环引用一般使用weak来定义
持有协议之后接下来就是调用协议方法来进行传值
点击页面2button的时候我们来调用我们的方法
//代理传值--反向传值
这里呢使用我们的id指针 self.delegate调用我们协议的方法
passValue
传值传谁呢 就传我们textfile里面输入的值
[self.delegate passValue:self.textField.text];
这样就实现了代理的反向传值
那么页面2 通过协议将这个值传递之后,发出去之后 那页面1 怎么来接收呢
那就是我们的代理方了,代理方需要做两个事情就是遵守协议,实现协议方法。
遵守协议怎么来遵守呢
@interface ViewController ()<passValueDelegate>//遵守协议
并且实现协议方法
//代理传值--实现协议方法--接收来自页面2的值
-(void)passValue:(NSString *)str
接收来自页面2的值 :self.textField.text
我们并没有设置代理,两方如果通讯需要先把代理关系设置好才可以,
代理关系在哪设置,就是在我要通话的时候,第一个页面跳转至第二个页面的时候,需要先把代理关系设置好,设置好之后才可以进行通讯,才可以从第二个页面将值传回到第一个页面.将第二个页面他的代理设置为第一个页面(self)。
代理传值在iOS中是非常重要的传值方式也是用的最多的传值方式,相对来说要比前面三种麻烦一些。
代理传值需要有两个页面,分别是委托方和代理方
委托方和代理方要进行通讯的话,必须得先有一个协议,和生活里面也是一样的,中介 和 小名之间需要有一份协议,协议就规定了这两方之间如何进行通讯 ,也就是它做了一个约束,大家都遵守这个约束,就可以进行通讯了。
代理传值在iOS中的表现就是
委托方 呢持有协议并且调用协议方法
代理方呢遵守协议实现协议方法
我们如果想传值的 话,委托方持有协议调用协议方法进行传值
而代理方只要遵守了这个协议并且实现协议的方法 就可以接收委托方传过来的值,所以呢这就是我们的代理传值。他呢主要是围绕协议进行的,如果没有了协议没有了这个约束,那么两方是不能进行通讯的,所以这就是我们的代理传值。主要是应用于反向传值的。也就是说我们从页面1跳转到页面2 然后页面2反向给页面1进行传值,我们可以通过代理的方式来进行传递。
如果是反向传值,在页面2 回到页面1的时候,
NSUserDefault传值也可以实现跨页面的传值
NSUserDefault传值
这个传值比较简单 就是系统帮我们封装好的方法,也是将数据写入到文件中,不需要我们自己去创建文件,默认在沙盒路径中创建一个文件来存储我们的数据。
[[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults传值" forKey:@"NSUserDefaults"];
以上实现了NSUserDefaults写数据
写数据之后我们需要同步一下才能真正写入到我们的文件中。
写入到文件之后,第一个页面就完成了
第二个页面需要读取数据,在我们的文件中读取就行了
写入的时候以字典的方式写入,读取的时候以字典的方式读取,key就是刚才写入的key,一定要保持一致。以及唯一性,唯一性就是如果有多个
@"NSUserDefaults"保证key不能重复,一致性就是读的和写的必须是同一个key。
将数据从页面1传递到了页面2
NSUserDefaults传值
首先得有两个页面,页面1 页面2
沙盒文件,每一个工程创建之后都有一个默认的沙盒路径
通过一个页面将数据写入到沙盒文件中(通过NSUserDefaults的方式写入)
另一个页面在沙盒文件中读取数据就行了
和单例传值比较接近 比较像,只不过单例传值我们是在内存中创建了一个单例对象
现在是将我们的数据写入到磁盘也就是沙盒文件中
传值的方式是差不多的
单例传值
两个页面 一个单例对象
其中一个页面将数据写入到单例对象
另一个页面从单例对象读取数据
就实现了页面之间的数据传递 将一个页面的数据传入到另外一个页面,通过单例的方式来传递。
单例传值必须有一个单例对象。
创建一个单例对象,单例的创建
单例的创建
通过类方法创建单例对象
保证对象就是在程序运行过程中只有一个就可以了,每次通过类方法来调取单例的时候都是同一个对象就可以了。
要想保证这个过程,通过静态变量的方式来进行创建,因为静态变量一旦被赋了值之后 下次再读取的是上一次的值,和普通的局部变量不一样。
先通过静态变量的方式来创建一个变量
单例对象如何来传值呢
属性传值,在第一个页面向第二个页面跳转的时候,给第二个页面的属性赋了值,这就是属性传值
单例传值和属性传值也差不多,如果是正向的就可以给这个对象来赋值了。
先拿到单例对象,要通过单例来传值,比如也传递一个字符串,
从页面2给页面1传值通过单例也可以实现
在页面2点击button回到页面1的时候可以传递回一个值
在页面2定义一个属性 在页面1进行赋值 把数据传递到页面2,这就是正向传值,页面在进行跳转的时候就把值传递过去了
1属性传值
页面1 和页面2 从一面1 跳转到 页面2,直接通过属性的方式来将数据从页面1传递到页面2
两个页面之间如何实现传值
什么是页面传值
页面传值:即不同的视图控制器之间数据传递的过程
几种常见的页面传值方式:
1属性传值 页面1向页面2正向传值 可以通过属性传值
2单例传值 可以实现两个直接跳转的页面之间的传值,也可以实现跨页面之间的传值
3NSUserDefaults传值:也称为文件传值,向单例一样可以实现跨页面传值
4代理传值
5block传值
6通知传值
页面传值:
1、属性传值
2、单例传值
3、NSUserDefaults传值
4、代理传值
5、block传值
6、通知传值
正向反向传值1
通知传值相关过程:接收方先定义一个观察者等待通知中心发送消息;
发送方通知发送给出去到通知中心,并将数据传递出去给通知中心;通知中心回调数据给接收方
操作:给通知中心添加一个监听者;接收到通知之后的处理,去除通知的数据;发送通知;读取通知内容
block传值:可以做代理传值能做的一切工作,主要应用于反向页面传值
过程:在第二个页面定义一个block用于传值(copy属性),进行页面反响传值;早页面二跳转回页面一的时候进行传值;回到页面一(实现block属性),接收来自页面二的值,传的值存放在str里;()接收来自页面二的值,把它显示在页面一的lable上;
对比C语言函数指针??
代理传值:主要应用于反向传值。其中,协议应该由委托方定义
步骤:委托方创建协议;委托方定义一个传值的方法;定义一个持有协议的id指针;.m文件中调用协议进行传值;遵守协议,并且实现协议方法;两者的财力关系‘
NSUserDefaults传值:是正常传值,从文件中读取显示;
正向:将数据写入到文件中----从文件中读取(以字典的方式)并现在在textfield上;命令:NSUserDefaults standardUserDefaults setObject…………
反向:读取自我文本值、K;写入到文件;接收
沙盒:iOS应用程序为自己创建的独立,封闭,安全(的一个文件系统目录.
沙盒路径???
单例创建
创建单例类;创建一个类方法,
创建单例对象;通过类方法(在.h文件中)创建;实现这个类方法的时候需要创建一个单例对象 -静态变量的方式,目的是为了在程序运行过程中只有一个对象(静态变量每次会保留上一次的值)
备注:创建一个类方法是在.m和.h文件中都有,但是类方法的实现在.m文件中
在第一个页面的.m文件中,通过单例方法拿到单例对象;在第二个页面的.h文件中创建属性,然后给单例对象的自身属性赋值
备注:.m文件中要包含相关的.h文件,才能调用完成功能
接收并显示:从单例对象的属性中把值读出来,