iOS学习之界面通信
#import <UIKit/UIKit.h> @interface SecondViewController : UIViewController // 第一步:声明属性,用来存放上一页传过来的数据 @property (nonatomic, copy) NSString *contents; @end
在RootViewController.m里
- (void)loginAction
{
SecondViewController *sVC = [[SecondViewController alloc] init];
// 第二步进行赋值
sVC.contents = self.rootView.userTextField.text;
[self.navigationController pushViewController:sVC animated:YES];
}
在SecondViewController.m里
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"欢迎";
self.view.backgroundColor = [UIColor grayColor];
[self initLayout];
// 第三步,显示内容
self.nameLabel.text = self.contents;
}
- 第一步:声明协议
- 第二步:声明代理人
- 第三步:执行协议方法
- 第四步:签订协议
- 第五步:指定代理人
- 第六步:实现协议方法
// 1.定义协议 @protocol SecondViewControllerDelegate <NSObject> // 声明协议方法 - (void)changeValue:(NSString *)name; @end
第二步:在SecondViewController.h里声明代理人
@interface SecondViewController : UIViewController // 声明代理人,语义设置使用assign,防止循环引用 @property (nonatomic, assign) id<SecondViewControllerDelegate>secondDelegate; @property (nonatomic, strong) NSString *contents; @end
第三步:在SecondViewController.m使用代理调用代理的传值方法
// 实现方法使用代理从后往前传值
- (void)myBtnAction:(UIButton *)sender
{
// 1.把输入的内容传到第一页
// 第三步:使用代理调用代理的传值方法
// 判断代理是否实现了方法进行调用
if ([self.secondDelegate respondsToSelector:@selector(changeValue:)]) {
[self.secondDelegate changeValue:self.myField.text];
}
// 2.跳回到第一页
[self.navigationController popViewControllerAnimated:YES];
}
第四步:在RootViewController.m的延展里签订协议
// 第四步:签订协议 @interface RootViewController ()<SecondViewControllerDelegate> @property (nonatomic, strong) UILabel *myLabel; @property (nonatomic, strong) UIButton *myBtn; @end
第五步:在RootViewController.m指定当前对象为代理人
// 实现事件
- (void)rightAction
{
SecondViewController *sVC = [[SecondViewController alloc] init];
// 第五步:指定当前对象为代理人
sVC.secondDelegate = self;
[self.navigationController pushViewController:sVC animated:YES];
}
第六步:在RootViewController.m实现协议方法
// 第六步:实现协议方法
- (void)changeValue:(NSString *)name
{
self.myLabel.text = name;
}
- block是匿名函数,能够实现函数回调功能
- 用于页面之间通信,同时可以进行传值
void(^block)(void) = ^(void)
{
};
//其中:
//void(^block)(void)是类型
//block是变量名
//^(void){};是block实现
// 没有使用局部变量的block存储在全局区
// 使用局部变量的block存储在栈区
- 使用场景类似协议传值,都是解决从后一个页面往前一个页面传值问题
- 方式一:使用block属性实现回调传值
- 方式二:在方法中定义block实现回调传值
在SecondViewController.h声明block
@interface SecondViewController : UIViewController // 第一步:定义block属性 @property (nonatomic, copy) void (^block)(NSString *); @end
在FirstViewController.m实现block
- (void)myBtnAction
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
// 第二步:实现block
secondVC.block = ^void (NSString *textString) {
self.myLable.text = textString;
};
[self.navigationController pushViewController:secondVC animated:YES];
}
在SecondViewController.m进行block传值
// 实现方法 进行block传值
- (void)myBtnAction
{
// block传值
self.block(self.myField.text);
// 返回第一页
[self.navigationController popViewControllerAnimated:YES];
}
#import <UIKit/UIKit.h> @interface SecondViewController : UIViewController // 注意在MRC下,使用copy,在ARC下,可以使用copy,也可以使用strong来修饰,在strong中碰到block会自动有copy到堆内存的功能,但是苹果官方还是推荐使用copy,strong的内部实现也是copy @property (nonatomic, copy) void (^block) (); @end
2、在.m里实现block
// 实现block
/**
* 在controller中定义block属性
实现block的时候,如果block里面需要使用当前控制器对象,不可以直接使用self,否则会引起循环引用
*/
// 使用__weak 修饰防止循环引用
// __weak SecondViewController *secondVC = self;
__weak typeof(self) secondVC = self;
self.block = ^void () {
NSLog(@"这事block的实现");
secondVC.view.backgroundColor = [UIColor redColor];
};
// 调用block
self.block();
iOS学习之界面通信的更多相关文章
- 【原】iOS学习43即时通信之XMPP(2)
本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...
- 【原】iOS学习42即时通信之XMPP(1)
1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...
- iOS学习之界面间传值
/** * 界面间传值步骤 1.界面传值第一种场场景:从前往后传值. 秘诀:属性传值.(葵花宝典). 招式:(1).在后一个界面定义属性,属性的类型和传出数据类型一致. (2).在进入下一界面之前, ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
- ios 学习路线总结
学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- 黑苹果-IOS学习的开始
深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ----- ...
- iOS 学习资源
这份学习资料是为 iOS 初学者所准备的, 旨在帮助 iOS 初学者们快速找到适合自己的学习资料, 节省他们搜索资料的时间, 使他们更好的规划好自己的 iOS 学习路线, 更快的入门, 更准确的定位的 ...
- 【原】iOS学习之SQLite和CoreData数据库的比较
1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
随机推荐
- django apache error.log过大
利用apache运行django框架,发现apache中error.log增长迅猛,寻找原因不得,于是手动清空... 但是当server遇到问题时,文件过大,导致定位问题十分不便 于是决定探个究竟 首 ...
- ES6生成器基础
ES6引进的最令人兴奋的特性就是一种新的函数生成方式,称为生成器(generator).名称有点奇怪,但是第一眼看上去行为更加奇怪.文章主要介绍生成器如何工作,然后让你明白为什么他们对于未来的JS会有 ...
- Visual C++ 开发心得与调试技巧
自己平时收集的一些技巧与心得,这里分享出来,普及一下知识. 1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Releas ...
- 解决error C2011: 'fd_set' : 'struct' type redefinition的方法
http://www.cnblogs.com/ark-zhang/archive/2013/06/19/3144383.html 首先说明这个问题由于重复定义引起的编译错误. 先说明解决方法,然后 ...
- UIButton设置imgae图片自适应button的大小且不变形
在某些情况下,我们使用的UIButton的背景图片不一定就是标准的尺寸,有时会偏大,那么怎么办? 这个比较简单直接设置 : self.imageView.contentMode = UIView ...
- DataGridView点击排序完成后如何禁止自动排序
Summary: Disable sorting after clicking DataGridView columnheader,Prevent databound DataGridView fro ...
- 收缩SQL数据库日志
各位同学,相信大家在使用SQL数据库时,常常会遇到日志文件比数据库文件还在大的情况.以下有一简单的办法,可以快速的删除日志档.使用其大小变为540K. 供各位参考. DUMP TRANSACTION ...
- 未能加载文件或程序集“Oracle.Web, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项
当前系统环境描述: Win7x64+VS2012+IIS7 当前情况描述: 发布Web服务,在浏览的时候出现以下问题:未能加载文件或程序集“Oracle.Web, Version=2.112.1.0, ...
- .NET程序员爱上网站[整理]
1.博客园(代码改变世界) http://www.cnblogs.com 2.开源中国社区(开源软件发现.使用和交流平台) http://www.oschina.net 3.CSDN(中国最大的IT社 ...
- PHP通过字符串调用函数
1. call_user_func function a($b,$c){ echo $b; echo $c; } call_user_func('a', "111","2 ...