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语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
随机推荐
- 【python】基础
[字符串]前后引号必须要匹配,相关函数int(),float(),str(),repr(),format(),还有切片运算符 a = 'text' 单引号指定的字符串必须在一个逻辑 ...
- rel="stylesheet" 描述
<link type="text/css" rel="stylesheet" href="css/style.css"/> re ...
- React模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android IOS WebRTC 音视频开发总结(四八)-- 从商业和技术的角度看视频行业的机会
本文主要从不同角度介绍视频行业的机会,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,欢迎关注个人微信公众号blacker ----------------------------- ...
- 解决VirtualBox 上的XP 蓝屏,自动重复启动
启动时的蓝屏显示错误信息是: STOP 0x000000CE (...) DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS intelppm. ...
- mysql数据库去重语句和不同表之间列的复制语句
1.去重语句:DELETE FROM `v_klg_item` WHERE id NOT IN (SELECT * FROM (SELECT MAX(id) FROM `v_klg_item` GRO ...
- 软件工程 speedsnail 第二次冲刺8
20150525 完成任务:障碍物整体设计,实现一页多次布局: 遇到问题: 问题1 与现有资源冲突 解决1 未解决 明日任务: 蜗牛碰到线后速度方向的调整:(做优化)
- wamp+zendstudio12+xDebugger环境搭建
1.网上找到Wampserver,下载即可,一路安装即可,安装好后打开浏览器输入http://localhost即可看到有没有安装成功 比如我的是这样的,就说嘛wampserver安装成功了 wamp ...
- [leetcode]_Remove Nth Node From End of List
题目:移除linked-list从尾到头的第N个元素 自我思路:因为题目给出的N是从链表尾开始计算的,单链表不存在从子指向父亲的反向指针,因此我先计算链表的整个长度len,然后用len - N来表示正 ...
- PHPExcel读取excel的多个sheet存入数据库
//批量导入文章 excel读取 public function importdata ( $filename, $tmp_name ) { //设置超时时间 set_time_limit(0); $ ...