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语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
随机推荐
- 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares
P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 暂时没有 ...
- ASP.NET MVC4 学习系统五(Razor)
Razor ,你好! Razor 是一种把代码和内容进行平滑集成的语法.尽管它引入了一些新的符号和关键字,但是Razor并不是一种新的语法.相反,Razor允许用户使用已知的语言来编写代码 ...
- java事务管理
一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...
- Duilib学习笔记《06》— 窗体基类WindowImpBase
在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...
- cacti yum快速部署
简述:本来是编译安装的,由于编译过程中库文件关联太多,安装文件一定要有顺序性,报错太多,到了rrdtool这一步说什么都安装不过去了,由于时间问 题,选择了yum安装,对于编译安装,这个要简单多了,她 ...
- sql语句小练习一
create database aaa go use aaa go create table student( sno varchar(3), sname varchar(4) not null ...
- ORA-00031: session marked for kill 处理Oracle中杀不掉的锁
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...
- Android IOS WebRTC 音视频开发总结(十五)-- 培训课程大纲
最近在给公司做内部培训,主要是关于即时通讯和移动视频通话,包括android与android,ios与ios,android与ios,以及手机与PC. ------------------------ ...
- Windows计算机功能Java源码
代码如下 import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.e ...
- .NET环境配置(二)
打开IIS服务器 首先在设置程序池 应用程序池 设置 ASP.NET v4.0 ASP.NET v4.0 Classic CLassic.NET AppPool DefaultA ...