2.4 通知传值

方法描述:在通知接收方需要注册通知,并指定接收到通知后进行的操作;而在通知发送方则在需要传递数据时发送通知就OK了。通知的操作都是通过NSNotificationCenter来完成的。

但是要注意的两点是:

要想能够接收到通知进行处理,必须先注册通知。

在注册通知的页面消毁时一定要移除已经注册的通知,否则会造成内存泄漏

注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知

适用场景:

一般用于已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用通知反向传值。

但是也可以用于通过push进入子页面时向子页面传递数据,这时就可以用通知进行正向传值。

传递方式:正向传递(很少这样用)、反向传递(更常用)。

使用步骤:

反向传递:

在子页面返回的时候发送通知,注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知

@interfaceKLSubViewController ()@end

@implementationKLSubViewController- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

self.title= @"子界面";//布局代码省略

.......

}- (void) btnClicked:(UIButton *)btn {//发送通知回传数据,回传的数据格式自定义,这里定义为dictionary类型

[[NSNotificationCenter defaultCenter] postNotificationName:@"TransDataNoti" object:nil userInfo:@{@"content":@"子页面回传的数据"}];

[self.navigationController popViewControllerAnimated:YES];

}

在主页面注册通知,并制定接收到通知后执行的操作方法。需要注意的是,在注册通知的页面消毁时一定要移除已经注册的通知,否则会造成内存泄漏。

@interfaceKLMainViewController ()

@property (strong, nonatomic) UITextField*textField;

@property (strong, nonatomic) UIButton*button;@end

@implementationKLMainViewController- (void)dealloc {//移除所有通知

[[NSNotificationCenter defaultCenter] removeObserver:self];//移除某个//[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TransDataNoti" object:nil];

}- (void)viewDidLoad {

[super viewDidLoad];

self.title= @"主界面";//布局代码省略

......//注册通知,用于接收通知,接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];

}//接收通知,解析内容进行处理

- (void)notiReceived:(NSNotification *)sender {

self.textField.text= sender.userInfo[@"content"];

}- (void) btnClicked:(UIButton *)btn {

KLSubViewController*subVC =[[KLSubViewController alloc] init];

[self.navigationController pushViewController:subVC animated:YES];

}@end

正向传递:和反向传递的不走基本就是反过来就OK了,但是有一点需要注意的是正向传递时从主界面push到子界面时发送通知,这时候要确保子界面已经注册了通知,否则会收不到通知的,所以正向传递时,子界面通知的注册应该在子界面的初始化init方法中进行。

在主页面返回的时候发送通知,注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知。

@interfaceKLMainViewController ()

@property (strong, nonatomic) UITextField*textField;

@property (strong, nonatomic) UIButton*button;@end

@implementationKLMainViewController- (void)viewDidLoad {

[super viewDidLoad];

self.title= @"主界面";//布局代码省略

......

}- (void) btnClicked:(UIButton *)btn {

KLSubViewController*subVC =[[KLSubViewController alloc] init];//发送通知回传数据,回传的数据格式自定义,这里定义为dictionary类型

[[NSNotificationCenter defaultCenter] postNotificationName:@"TransDataNoti" object:nil userInfo:@{@"content":@"主页面传递的数据"}];

[self.navigationController pushViewController:subVC animated:YES];

}@end

在子页面注册通知,并制定接收到通知后执行的操作方法。正向传递时注册通知、基本布局不能放在viewDidLoad中,要放在初始化函数init中。

@interfaceKLSubViewController ()@end

@implementationKLSubViewController- (void)dealloc {//移除所有通知

[[NSNotificationCenter defaultCenter] removeObserver:self];//移除某个//[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TransDataNoti" object:nil];

}-(instancetype)init {

self=[super init];//初始化代码省略

......//注册通知,用于接收通知,接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];returnself;

}- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

self.title= @"子界面";

}//接收通知,解析内容进行处理

- (void)notiReceived:(NSNotification *)sender {

self.textField.text= sender.userInfo[@"content"];

}- (void) btnClicked:(UIButton *)btn {

[self.navigationController popViewControllerAnimated:YES];

}@end

2.5 NSUserDefaults传值

方法描述:NSUserDefaults传值是将所要传的值写在沙盒目录里面,需要获取值的时候直接访问沙盒,获取这个值就可以了,这种传值方法一般用在需要将数据本地存储的时候,比如:用户名之类,当用户下次登录或者使用app的时候,可以直接从本地读取。

适用场景:任何需要数据传递的场景都适用,但是传递数据的类型仅限于基本数据类型,不能用于自定义的对象类型。

传递方式:正向传值、反向传值。

使用步骤:

需要传值时将数据通过NSUserDefaults保存到沙盒目录里面

- (void) btnClicked:(UIButton *)btn {/*setObject:后面写的就是所需要传递的值

forKey:要具有唯一性、一致性;

唯一性是指:当代码中用到多个NSUserDefaults方法时,要保证不同的key不一样,否则就是覆盖值

一致性:这里传递一个值,当需要用到的时候,要用valueForkey的方法,这个key和传值时候写的key要一样,写错了就找不到值了。*/[[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults传值" forKey:@"NSUserDefaults"];

[[NSUserDefaults standardUserDefaults] synchronize];

[self.navigationController popViewControllerAnimated:YES];

}

需要使用值时通过NSUserDefaults从沙盒目录里面取值进行处理

_label.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"NSUserDefaults"];

2.6 单例传值

方法描述:单例传值的性质和NSUserDefaults传值的性质类似,只是单例传值是将数据保存在单例对象中,需要的时候同样从单例对象中去获取数据使用就ok。

适用场景:任何需要数据传递的场景都适用,传递的数据可以是任何类型的数据。

传递方式:正向传值、反向传值均OK。

使用步骤:

创建一个类,拥有一些属性用于保存数据,并实现单例方法

@interfaceKLDanliObj : NSObject

@property (nonatomic, copy) NSString*content; //保存数据数据的属性

+ (instancetype) shardDanLiObj; //单例对象获取方法

@end

#import "KLDanliObj.h"

static DanLi *danli =nil;@implementationKLDanliObj+(instancetype) shardDanLiObj {//实现方法,判断是否为空,是就创建一个全局实例给它

if (danli ==nil) {

danli=[[KLDanliObj alloc] init];

}returndanli;

}@end

需要传递数据时使用单例类将数据保存到单例的属性中

[KLDanliObj shardDanLiObj].content = @"主界面传递的数据";

需要使用值时通过单例的属性获取数据进行使用和处理

self.textField.text = [KLDanliObj shardDanLiObj].content;

2.7 KVC传值

方法描述:KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法,这样就可以在运行时动态地访问和修改对象的属性。这其实和属性传值比较类似。

适用场景:当从主页面push到子页面时,子页面需要使用到主页面的数据,我们需要使用到正向传值。

传递方式:正向传值

使用步骤:

在需要传值时使用KVC给子页面的属性进行赋值就ok了

- (void) btnClicked:(UIButton *)btn {

KLSubViewController*subVC =[[KLSubViewController alloc] init];//给子页面subVC的属性content赋值 和subVC.content = @"主页面传递的数据";效果一样

[subVC setValue:@"主页面传递的数据" forKey:@"content"];

[self.navigationController pushViewController:subVC animated:YES];

}

ios 给网页传值_iOS学习——页面的传值方式相关推荐

  1. ios 给网页传值_iOS开发—页面传值汇总

    情况1:A页面跳转到B页面 方法1:在页面跳转的同时,将A页面的值带到B页面 B页面的控制器中设置一个接收值的对象,并且设置一个显示值的textfield,设置outlet @property (no ...

  2. vue中页面跳转传值_vue的页面跳转方式和传值、取值

    写业务中,从一个页面跳转到另一个页面,经常需要传值和取值,如何实现? 1.通过router-link进行跳转,传递方式: 使用query传递参数,路由必须使用path引入, 使用params传递参数, ...

  3. vue变量传值_VUE 学习——父组件传值给子组件

    在我们编写前端代码时,经常遇到的一种场景,子组件需要使用父组件的值,这种情况下,我们可以使用props帮助我们进行父子组件间的通信.这里我们先模拟一个场景,展示如何使用. 场景:在父组件修改值,传递给 ...

  4. JavaWeb 页面跳转方式连接数据库

      今天是JavaWeb的第三节课,今天小编主要带大家学习页面跳转方式和连接数据库操作登录,大家有什么不懂的在下方评论或者私信,看到了一定会为大家解答的. 目录 一.界面跳转 JS中的跳转 Java中 ...

  5. ios 给网页传值_ios常见的页面传值方式

    iOS页面间的传值细分有很多种,基本的传值方式有三种:委托Delegate传值.通知NSNotification传值.Block传值,其他在项目中可能会遇到的还有:UserDefault或文件方式传值 ...

  6. ios学习-delegate、传值、跳转页面

    ios学习-delegate.传值.跳转页面   1.打开xcode,然后选择ios--Application--Empty Application一个空项目. 项目目录: 2.输入项目名称以及选择保 ...

  7. ios把数据传递到另一个页面_iOS 委托 页面之间传递数值

    ios的页面传值方法很多,本博客主要是 通过委托模式 来传值. 将一个页面中时间选择器的值传递到另外一个页面 主要包括三个模块 第一:A类 第二:委托协议 第三:B类 首先定义个一委托UIViewPa ...

  8. ios 图像坐标系_iOS学习笔记(1)-iPhone分辨率和坐标系

    终于决定开始学习ios开发了,很久之前有过一次ios开发培训,但是做完作业就落下了,一直没有再捡起.想到如今ios开发如火如荼,再不学习真的要掉队了,希望能督促自己在2个月内完成ios开发的基础学习以 ...

  9. ASP.NET 页面之间传值的几种方式

    对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有3-5年经 ...

最新文章

  1. 使用VC内嵌Python实现的一个代码检测工具
  2. OpenMP和MPI的区别
  3. 数据结构与算法 / 红黑树
  4. 机器学习-关联之FP-Growth算法原理及实战
  5. 对于经常需要truncate的表进行固定统计信息
  6. 分布式Session共享解决方案
  7. 查找N个数中第K大的数
  8. 指针 是否相同_算法一招鲜——双指针问题
  9. 机器视觉核心算法——图像预处理
  10. 3dmax学习6——扫描命令
  11. 计算机网络路由器和网关设置路由器,【计算机网络】网关和路由器功能的有哪些不同...
  12. 太飒了!这届乘风破浪的 IT 女神写得了代码、撕得掉年龄、跨得过行业!
  13. 导数和积分的转换关系
  14. 【看表情包学Linux】文件描述符 | 重定向 Redirection | dup2 函数 | 缓冲区的理解 (Cache)
  15. 容联云:实现异步 手机短信验证码
  16. 佛祖保佑永无BUG python版本
  17. 工业智能网关BL110应用之63:如何实现智能楼宇控制BACnet 接入金鸽Modbus云平台
  18. 一些技巧,如何更高层次编写优质嵌入式C代码?
  19. Bean 生命周期详解
  20. [附源码]Nodejs计算机毕业设计母婴商品店进出货管理系统Express(程序+LW)

热门文章

  1. Base64 编解码
  2. 谈论AI之前,你搞懂人类了吗?(颠覆认知)
  3. 硅谷大佬提前剧透未来!6本书,助你走在AI时代前沿
  4. python 新建文件 hdfs_python基础操作以及hdfs操作
  5. 程序员管理思维修炼,只需要反复阅读本篇
  6. 2020 年 3 月全国程序员工资排名!
  7. Jeecg - MiniDao专题讲解公开课(2013-08-22 晚8:30-10:30 )
  8. SpringBoot2 整合ElasticJob框架,定制化管理流程
  9. 【Matlab】private文件夹
  10. Linux多线程实践(7) --多线程排序对比