废话不多说,直接进入主题:

这里要说的方式有6种:1、属性传值 2、block 3、delegate 4、UserDefault 5、单例 6、通知(篇幅原因我只写核心代码,如果看不懂可以直接在最下面去github 看demo)

1、block(个人觉得最常用的场景下最好用的)

先说我最常用的block吧,属性传值就很简单了,主要用于顺传,我们在这里包括下面都主要讲逆传。属性传值放在block里一起写了。

下面上代码:

 //secondVc.h
typedef void (^TestBlock) (NSString *str); @interface ATNextViewController : UIViewController
//定义block
@property (nonatomic, copy) TestBlock testBlock;
@end
 //secondVc.m
- (void)btnClick:(UIButton *)btn {
if(self.testBlock) { //block传值
self.testBlock(@"绿色");
} [self.navigationController popViewControllerAnimated:YES];
}

下面是第一个VC代码:

//Vc.m
- (void)btnClick:(UIButton *)btn {
ATNextViewController *nextVc = [[ATNextViewController alloc] init];
nextVc.inStr = @"红色"; //属性传值,用于顺传,直接传就好了 //这里是block回传的值
nextVc.testBlock = ^(NSString *str) {
NSLog(@"%@",str);
}; [self.navigationController pushViewController:nextVc animated:YES];
}

2、delegate

代理要首先搞清楚谁传值给谁,我这里主要写的都是逆传,内层控制器传向外层控制器,那也就是secondVc传值给Vc,所以应该是Vc作为secondVc的代理,在代理方法接收secondVc传过来的值。

secondVc的代码:

 //secondVc.h

 //声明代理
@protocol ATNextVcDelegate <NSObject> @optional
- (void)inStr:(NSString *)inStr;
@end
@interface ATNextViewController : UIViewController
@property (nonatomic, weak) id<ATNextVcDelegate> delegate;
@end
 //secondVc.m
//代理传值 - (void)btnClick:(UIButton *)btn {
if ([self.delegate respondsToSelector:@selector(inStr:)]) {
[self.delegate inStr:@"红色"];
}
[self.navigationController popViewControllerAnimated:YES];
}

Vc代码:

 //Vc.m
//代理方法接收值 - (void)btnClick:(UIButton *)btn {
ATNextViewController *nextVc = [[ATNextViewController alloc] init];
nextVc.delegate = self;
[self.navigationController pushViewController:nextVc animated:YES];
}
#pragma mark - ATNextVcDelegate
- (void)inStr:(NSString *)inStr {
NSLog(@"%@========", inStr);
}

3、UserDefault

这种方式会在本地存下文件,属于数据持久化(关于数据持久化有时间会另开一篇详细讲解)的一种。再次打开程序依然会有上一次保存留下的值。

这里只有存和取两个动作:

 //secondVc.m
- (void)btnClick:(UIButton *)btn {
//存
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"黄色" forKey:@"btnColor"];
[defaults setObject:@"100x100" forKey:@"btnSize"];
[defaults synchronize]; [self.navigationController popViewControllerAnimated:YES]; }
 //Vc.m

 - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//取
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *btnColor = [defaults objectForKey:@"btnColor"];
NSString *btnSize = [defaults objectForKey:@"btnSize"];
NSLog(@"%@ %@",btnColor,btnSize);
}

和之前不同的是,这种方式只要进入这个界面就会取值,而不一定只是从上一个界面返回才传值。

4、单例

单例一般直接做成宏,用的时候拿过来直接用就好了,所以单例宏文件这里就不写了,感兴趣可以去demo看一下,直接上代码:

这里我定义了一个单例类,用它存用户登录状态的信息,之后是控制器中的使用:

//ATLoginStatus.h

#import <Foundation/Foundation.h>
#import "ATSingleton.h" @interface ATLoginStatus : NSObject
@property (nonatomic, assign) BOOL isLogin;
@property (nonatomic, copy) NSString *phoneNumStr; SingletonH(LoginStatus)
@end
//  ATLoginStatus.m

#import "ATLoginStatus.h"

@implementation ATLoginStatus
SingletonM(LoginStatus)
@end
//secondVc.m

- (void)btnClick:(UIButton *)btn {
//存
ATLoginStatus *status = [ATLoginStatus sharedLoginStatus];
status.phoneNumStr = @"";
status.isLogin = YES; [self.navigationController popViewControllerAnimated:YES]; }
//Vc.m

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//取
ATLoginStatus *status = [ATLoginStatus sharedLoginStatus];
NSLog(@"%@ %d",status.phoneNumStr,status.isLogin);
}

5、通知

通知主要是发通知和收通知两部:

发通知:

 //secondVc.m

 - (void)btnClick:(UIButton *)btn {
//发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"btnColorNoti" object:self userInfo:@{@"btnColor": @"黄色"}];
[self.navigationController popViewControllerAnimated:NO];
}

收通知:

//Vc.m

- (void)viewDidLoad {
[super viewDidLoad];
//...
//注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(btnColorNoti:) name:@"btnColorNoti" object:nil];
}
//收到通知的时候调用这个方法接受到通知消息
- (void)btnColorNoti:(NSNotification *)noti {
NSDictionary *dict = noti.userInfo;
NSLog(@"%@",dict[@"btnColor"]);
}
//控制器销毁的时候注销通知监听
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

OK,就是这些了,虽然这些方式都能用于控制器之间传值,但是其实有些方式是没有必要用在我举例的这种普通场景(跑一下我的demo就明白这是什么场景了)下的(当然属性传值只能用于顺传),在我所举例的这种场景下,用block是最简洁的,delegate也可以,但是个人感觉对于传值来说过于麻烦了,通知也还可以,但还是不如block。但是单例和UserDefaults其实是不需要在这种场景下用的,他们可以用在两个控制器隔很远的情况下,或者两个控制器没有关联的情况下。就像我举的单例的例子中,存一下全局都可能用到的如用户信息,这样全局都能随时取得这个信息。

下面是demo:

my github:https://github.com/alan12138/somethingInteresting

iOS页面间传值的一些方式总结的更多相关文章

  1. iOS页面间传值的六种方式

    一般ios页面间的传值方式分为6种:1.属性传值:2.block:3.delegate:4.UserDefault:5.单例:6.通知. 0&1.block 先说我最常用的block吧,属性传 ...

  2. iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值实现方法:1.通过设置属性,实现页面间传值:2.委托delegate方式:3.通知notification方式:4.block方式:5.UserDefault或者文件方式:6.单例模式 ...

  3. iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)

    iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notific ...

  4. 【转】iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)-- 不错

    原文网址:http://www.cnblogs.com/JuneWang/p/3850859.html iOS页面间传值的方式(NSUserDefault/Delegate/NSNotificatio ...

  5. iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)   iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...

  6. iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNot ...

  7. iOS 页面间传值 之 单例传值 , block 传值

    ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同 ...

  8. iOS 页面间传值 之 属性传值,代理传值

    手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但 ...

  9. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

随机推荐

  1. NPOI、MyXls、Aspose.Cells 导入导出Excel(转)

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导s出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你 ...

  2. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  3. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  4. Android学习第三天-打包常用命令

    在前面<Android学习第一天-adb常用命令>和 <Android学习第二天-android常用命令>两篇博文中,我们重点讲解了adb和android的常用命令,下面我们讲 ...

  5. 【PRINCE2是什么】PRINCE2认证之七大原则(3)

    我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第三个原则:明确定义的角色和职责. 项目离不开人员,错误的人来了,合适的人没 ...

  6. 浏览器执行js代码的机制--对于我们深入了解js有很大的帮助,同时面试时候也都能用得到。

    前端小菜又来了,这些天每天工作,晚上学习太累了.趁星期天给自己放个假.写完这个博客就要出去high了.鸡冻.接下来进入正题啦, 你可能要问,我们学习这个有什么用啊?这样我先给大家来个小小的面试题. a ...

  7. ThinkPHP3.2设置404跳转页面

    在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面,类如下图: 解决办法: 1.在ThinkPHP3.2详细的介绍了该框架下的ThinkPHP惯例配置文件convent ...

  8. 在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 后期博客首发:http://dnt.dkill.net/Article/Det ...

  9. 实战MEF(2):导出&导入

    上一文中,我们大致明白了,利用MEF框架实现自动扫描并组装扩展组件的思路.本文我们继续前进,从最初的定义公共接口开始,一步步学会如何使用MEF. 在上一文中我们知道,对于每一个实现了公共规范的扩展组件 ...

  10. XenServer pool 移除server 设置master

    如果因为Pool中Master主机由于某种原因导致失效,会引起整个Pool进入紧急模式,恢复步骤如下: 在成员服务器上输入如下命令 # xe host-emergency-ha-disable     ...