一般ios页面间的传值方式分为6种:1、属性传值;2、block;3、delegate;4、UserDefault;5、单例;6、通知。

0&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 = @"12345";

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其实是不需要在这种场景下用的,他们可以用在两个控制器隔很远的情况下,或者两个控制器没有关联的情况下。就像我举的单例的例子中,存一下全局都可能用到的如用户信息,这样全局都能随时取得这个信息。

iOS页面间传值的六种方式的更多相关文章

  1. iOS页面间传值的一些方式总结

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

  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. Spring Security(16)——基于表达式的权限控制

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  2. IOS 基于TCP的socket通信详解(原创)

    最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...

  3. 原生JavaScript+CSS3实现移动端滑块效果

    在做web页面时,无论PC端还是移动端,我们会遇到滑块这样的效果,可能我们往往会想着去网上找插件,其实这个效果非常的简单,插件代码的的代码往往过于臃肿,不如自己动手,自给自足.首先看一下效果图: 分析 ...

  4. mvc前端样式自定义

    1.别忘记加 htmlAttributes @Html.EditorFor(model => model.Quantity, new { htmlAttributes = new { @clas ...

  5. 用PhotoSwipe制作相册,手势可放大

    1.引入css和js <link href="css/photoswipee.css" rel="stylesheet" type="text/ ...

  6. nginx trouble shooting

    除去配置语法失误.逻辑失误 nginx中的大部分问题都是前端到后端联通性 curl 域名没反应 cyr@test:/etc/nginx/sites-enabled$ curl test.hehe.ex ...

  7. SQL 查询优化 索引优化

    sql语句优化 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的 ...

  8. logstash 输出到elasticsearch 自动建立index

    由于es 单index 所能承受的数据量有限,之前情况是到400w数据300G左右的时候,整个数据的插入会变得特别慢(索引重建)甚至会导致集群之间的通信断开,于是我们采用每天一个index的方法来缓解 ...

  9. HDU 5834 Magic boy Bi Luo with his excited tree

    树形dp. 先dfs一次处理子树上的最优解,记录一下回到这个点和不回到这个点的最优解. 然后从上到下可以推出所有答案.细节较多,很容易写错. #pragma comment(linker, " ...

  10. 抢红包算法 java

    抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点.因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可.另外像小米这样 ...