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语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
随机推荐
- UVa10603 倒水 Fill-状态空间搜索
https://vjudge.net/problem/UVA-10603 There are three jugs with a volume of a, b and c liters. (a, b, ...
- No.004 Median of Two Sorted Arrays
4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...
- devexpress中如何绑定ASPxTreeList控件
效果图: //前端控件代码: <dx:ASPxTreeList ID="Tree_Gooslist" AutoGenerateColumns="False" ...
- iOS 如何根据经纬度来定位位置
/** * 初始化一个经纬度结构体 */ CLLocationCoordinate2D center = {[latitudeTF.text floatValue],[longitudeTF.tex ...
- Duilib扩展《01》— 双击、右键消息扩展
用过duilib的可能会发现,duilib中有些控件没能很好的区分左键.右键等消息.所以根据实际需要,我们需要进行相关区分处理,或者自行扩展. 一. 左键.右键消息区分 我们以CListUI控件来分析 ...
- 查找Safari相关迹证
日前有取证的同好提及Safari,想了解详细步骤,因而在此再补充说明相关. 除了Winodws外,Mac OS X也有为数不少的使用者,以下便以OS X自带的Safari浏览器为例,来查看有哪些重要迹 ...
- 二十一、contextMap中放的常用数据
二十一.contextMap中放的常用数据 request:请求范围的数据.即ServletRequest中的那个Map parameters:请求参数的数据.即request.getParamete ...
- 最新仿梦芭莎免费ecshop模板
最新仿梦芭莎免费ecshop模板,该源码很真实地模仿了我们比较熟悉的梦芭莎购物网站的,我们知道该网站商城很受大家的喜欢的,而且界面也很漂亮的,希望能够帮到大家的学习. <ignore_js_op ...
- Visitor
#include <iostream> #include <vector> using namespace std; #define DESTROY_POINTER(ptr) ...
- maven私服搭建和启动遇到的问题
1.私服下载地址:http://www.sonatype.org/nexus/ 2.在win10中安装nexus时提示:wrapper | OpenSCManager failed - 拒绝访问. ( ...