代理是IOS开发中用到的一种设计模式。今天做了一个代理的小练习:

以下项目实现了两个页面之间的相互切换,并且在切换页面的时候完成了从一个页面往另一个页面的传值。从主页面往其他页面传值是容易的,但是反过来从其他页面往主页面传值就难了,要用到delegate设计模式。

新建一个ios的项目,然后再新建一个ViewController,起名为TwoViewController,这样,加上新建项目时默认生成的那个ViewController,总共有两个ViewController,其中新建项目默认生成的那个是主ViewController。

为了使用代理模式,我们要先定义一个协议,这个协议如下:

 #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
//定义一个协议,协议中定义一个传值的方法
//定义一个协议,协议中定义一个传值的方法
//定义一个协议,协议中定义一个传值的方法
@protocol Mydelegate <NSObject> @required
-(void)changeValue:(NSString *)stringnow; @end

协议中定义了一个传值的函数,用来把第二个ViewController中的值传给第一个ViewController,如果不是用代理,我们只能从第一个ViewController向第二个ViewController传值,而不能反过来,从第二个ViewController给第一个ViewController传值(具体原因没理解,以后理解了再补上)

完成协议后让第一个ViewController遵守这个协议,也就是在第一个ViewController的.h文件中声明第一个ViewController遵守这个协议<Mydelegate>:

 #import <UIKit/UIKit.h>

 //第一个页面应用Mydelegate协议
//第一个页面应用Mydelegate协议
//第一个页面应用Mydelegate协议
#import "Mydelegate.h"
@interface ViewController : UIViewController <Mydelegate> @end

接下来在第一个ViewController的.m文件中实现changeValue这个传值方法:

 #import "ViewController.h"
#import "TwoViewController.h"
@interface ViewController (){
UITextField *textFieldnow; } @end @implementation ViewController //第一个页面引用Mydelegate协议,故要在.m文件中实现Mydelegate中定义的必须要实现的方法
//第一个页面引用Mydelegate协议,故要在.m文件中实现Mydelegate中定义的必须要实现的方法
//第一个页面引用Mydelegate协议,故要在.m文件中实现Mydelegate中定义的必须要实现的方法
-(void)changeValue:(NSString *)stringnow{
textFieldnow.text=stringnow;
} - (void)viewDidLoad {
[super viewDidLoad];
// 初始化textFieldnow
textFieldnow = [[UITextField alloc]initWithFrame:CGRectMake( , , , )]; // 设置textFieldnow的背景颜色
textFieldnow.backgroundColor = [UIColor colorWithRed:0.139 green:0.760 blue:1.000 alpha:1.000]; // 为textFieldnow添加输入完成后让键盘消失的事件
[textFieldnow addTarget:self action:@selector(losefirstresponsder:) forControlEvents:UIControlEventEditingDidEndOnExit]; // 把textFieldnow添加到view中
[self.view addSubview:textFieldnow]; } //本函数的功能是Textfield在输入完后按return让虚拟键盘消失
-(void)losefirstresponsder:(id)sender{
[self resignFirstResponder];
} - (IBAction)TurnToNext:(id)sender {
TwoViewController *twoView = [[TwoViewController alloc]init]; // 委托机制最关键的部分,在跳转到第二个界面之前把第二个界面的委托对象指向自己
// 委托机制最关键的部分,在跳转到第二个界面之前把第二个界面的委托对象指向自己
// 委托机制最关键的部分,在跳转到第二个界面之前把第二个界面的委托对象指向自己
twoView.delegate = self; // 把第一个界面的textFieldnow的值传给第二个界面中的namestring
twoView.namestring = textFieldnow.text; // 跳转到第二个界面
[self presentViewController:twoView animated:YES completion:nil]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

补充:

让键盘消失还有如下方法,思想是当鼠标点击文本框外的地方时,文本框就释放第一响应者的身份,代码如下:

 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

     [textFieldinputUrl resignFirstResponder];
}

第二个ViewController的.h文件如下:

 #import <UIKit/UIKit.h>
#import "Mydelegate.h" @interface TwoViewController : UIViewController @property(nonatomic,retain )NSString *namestring;
//定义一个变量delegate
//定义一个变量delegate
//定义一个变量delegate
@property(nonatomic,weak) id <Mydelegate> delegate; @end

第二个ViewController的.m文件如下:

 #import "TwoViewController.h"

 @interface TwoViewController (){
UILabel *label;
UITextField *textFieldnow1; } @end @implementation TwoViewController
@synthesize namestring;
@synthesize delegate;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
[self.view addSubview:label];
label.text = namestring;
textFieldnow1 = [[UITextField alloc]initWithFrame:CGRectMake( , , , )]; textFieldnow1.backgroundColor = [UIColor colorWithRed:0.139 green:0.760 blue:1.000 alpha:1.000];
[textFieldnow1 addTarget:self action:@selector(losefirstresponsder:) forControlEvents:UIControlEventEditingDidEndOnExit];
[self.view addSubview:textFieldnow1]; }
- (IBAction)BackToHome:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
[delegate changeValue:textFieldnow1.text];
} -(void)losefirstresponsder:(id)sender{
[self resignFirstResponder];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end

要实现通过代理让第二个页面传递一个值给第一个页面,最关键的一点就是在第一个页面中要有一个指针指向self,也就是twoView.delegate = self;这条语句:

 //    委托机制最关键的部分,在跳转到第二个界面之前把第二个界面的委托对象指向自己
// 委托机制最关键的部分,在跳转到第二个界面之前把第二个界面的委托对象指向自己
// 委托机制最关键的部分,在跳转到第二个界面之前把第二个界面的委托对象指向自己
twoView.delegate = self;
而协议的作用就是提供了一个函数,起到了桥梁的作用。

IOS开发-UI学习-delegate(代理)的使用,键盘消失的更多相关文章

  1. iOS开发——UI进阶篇(六)键盘处理

    一.键盘通知我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态 键盘状态改变的时候,系统会发出一些特定的通知UIKeyboardWillShowNotification // ...

  2. iOS开发UI篇—CAlayer(自定义layer)

    iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...

  3. iOS开发UI篇—核心动画(UIView封装动画)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

  4. iOS开发UI篇—核心动画(关键帧动画)

    转自:http://www.cnblogs.com/wendingding/p/3801330.html iOS开发UI篇—核心动画(关键帧动画) 一.简单介绍 是CApropertyAnimatio ...

  5. iOS开发UI篇—核心动画(基础动画)

    转自:http://www.cnblogs.com/wendingding/p/3801157.html 文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(基础动画) iOS ...

  6. iOS开发UI篇—核心动画简介

    转自:http://www.cnblogs.com/wendingding/p/3801036.html iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画 ...

  7. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  8. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...

  9. iOS开发UI篇—UITableview控件使用小结

    iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...

  10. iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建

    iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...

随机推荐

  1. MaterialEditText 控件学习

    这个视图原始框架地址:https://github.com/rengwuxian/MaterialEditText 指导手册:http://www.rengwuxian.com/post/materi ...

  2. HDU 2672 god is a girl

    先找规律,发现是斐波那契数列...然后..水题.. #include<cstdio> #include<cstring> #include<cmath> #incl ...

  3. Chapter 1 First Sight——18

    But at least he sent me to an empty desk at the back without introducing me to the class. 但是最后他给我最后面 ...

  4. jq中的evet.target

    1.this和event.target的区别: js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的目标DOM元素: 2.this和event.t ...

  5. Linux RAR 安装和使用

    描述:Linux默认自带ZIP压缩,最大支持4GB压缩,RAR的压缩比大于4GB. 流程:下载 >安装 > 使用 ------------------------------------- ...

  6. zabbix Lack of free swap space

    Zabbix初始设计是大型公司用于监控服务器集群的,但日常中也用于监控VPS或云主机.后者情况下Zabbix的很多配置和属性就没有经过优化,取决于监控的对象和用途,经常需要对一些Zabbix配置进行调 ...

  7. subversion javahl

    新建android项目时,总是说"javahl, require version 1.8"云云. dpkg -l | grep libsvn-java1.6 apt-get upd ...

  8. C# 经典入门15章 -TabControl

  9. linux shell——md5sum,sha1sum,sort,uniq (转)

    1.文件校验 1. md5sum eg: md5sum filename 注:生成一个128位的二进制位,即32位的十六进制字符串 1.验证文件的正确性: md5sum  file1 file2 &g ...

  10. 升级版本后报这个异常 : org.springframework.beans.factory.NoUniqueBeanDefinitionException

    今天写代码时出现上面这个异常,很是奇怪.从网上下载了个Spring源码包,通过追踪源码发现并没有到加载工程代码中去.于是分析和Spring包有关系. 查看依赖库发现有两个版本的Spring.通过分析去 ...