代理是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. stray '/241' in program 错误

    意思是c/c++中的编译错误. 该错误是指源程序中有非法字符,需要去掉非法字符.一般是由于从别的地方粘贴过来造成的. 方法:1.把所粘的文字放到记事本里就行了 2.把出错行的空格删掉重新打一下试试.

  2. HDU - 4994 Revenge of Nim (取石子游戏)

    Problem Description Nim is a mathematical game of strategy in which two players take turns removing ...

  3. SVM支持向量机算法

    支持向量机(SVM)是另一类的学习系统,其众多的优点使得他成为最流行的算法之一.其不仅有扎实的理论基础,而且在许多应用领域比大多数其他算法更准确.  1.线性支持向量机:可分情况 根据公式(1)< ...

  4. Linux运维常用的命令详解

    1. 查看系统内核版本 [root@funsion geekxa]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m 显示了系 ...

  5. 在程序中用new ClassPathXmlApplicationContext()的注意事项

    http://blog.csdn.net/budapest/article/details/38493003

  6. CF 299 div2 C 博弈

    http://codeforces.com/contest/299/problem/C 题目大意: 给两个0,1串保证长度都是2*n(偶数),问,Yaroslav, Andrey按照顺序取,首先是ya ...

  7. Delphi MaskEdit用法(转)

    源:http://www.cnblogs.com/zhangzhifeng/archive/2011/10/12/2208640.html MaskEdit是用来建立编辑框的,但它与Edit编辑框可以 ...

  8. 简单的js实现网页时钟

    js实现时钟. <div id="clock"></div> <script type="text/javascript"> ...

  9. PAT (Advanced Level) 1057. Stack (30)

    树状数组+二分. #include<iostream> #include<cstring> #include<cmath> #include<algorith ...

  10. Direct3D中的绘制

    1.顶点缓存和索引缓存 一个顶点缓存是一个包含顶点数据的连续内存空间:一个索引缓存是一个包含索引数据的连续内存空间. 顶点缓存用接口IDirect3DVertexBuffer9表示:索引缓存用接口ID ...