IOS开发-UI学习-delegate(代理)的使用,键盘消失
代理是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(代理)的使用,键盘消失的更多相关文章
- iOS开发——UI进阶篇(六)键盘处理
一.键盘通知我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态 键盘状态改变的时候,系统会发出一些特定的通知UIKeyboardWillShowNotification // ...
- iOS开发UI篇—CAlayer(自定义layer)
iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
- iOS开发UI篇—核心动画(关键帧动画)
转自:http://www.cnblogs.com/wendingding/p/3801330.html iOS开发UI篇—核心动画(关键帧动画) 一.简单介绍 是CApropertyAnimatio ...
- iOS开发UI篇—核心动画(基础动画)
转自:http://www.cnblogs.com/wendingding/p/3801157.html 文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(基础动画) iOS ...
- iOS开发UI篇—核心动画简介
转自:http://www.cnblogs.com/wendingding/p/3801036.html iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画 ...
- iOS开发UI篇—UIScrollView控件实现图片缩放功能
iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...
- iOS开发UI篇—UITableview控件基本使用
iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...
- iOS开发UI篇—UITableview控件使用小结
iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...
随机推荐
- JSP内置对象--pageContext对象(非常重要!!!)
pageContext对象是javax.servlet.jsp.PageContext类的实例,只要表示的是一个jsp页面的上下文,而且功能强大,几乎可以操作各种内置对象. >forward(S ...
- Android sdk content loader 0%的解决方案
Eclipse在启动时,经常会碰到半天启动不起来的情况,罪魁祸首就是“Android sdk content loader 0%”,题主经常是受这玩意的百般折磨,大早上一来就被这扫了工作的激情,浪费了 ...
- BAT54C 二极管是如何工作的?
这是一个多电源供电的电路:Vcc是正常供电电源(如5V,由市电变换得到),电压大于(Vcc1-Vf),正常供电时二极管不导通:Vcc1是电池供电电源,当Vcc撤掉时,DD1(上边的二极管)导通,由Vc ...
- maven项目如何跳过某些junit test,或者指定执行部分junit test
maven-surefire-plugin的插件提供了对测试目录的配置,想要细看的或者学习更多东西的可以去http://maven.apache.org/surefire/maven-surefire ...
- POJ 3660 Cow Contest 弗洛伊德
题意难懂是POJ的标配,这都TM赖本泽马. 题意:有N头牛进行了M场比赛,比赛双方是A - B 且总是A赢(前面的那个数赢),如果说A赢B,B赢C 则可以确定A赢C.问最终多少头牛的排名可以确定. 思 ...
- audio,video标签
<html><head lang="en"> <meta charset="UTF-8"> <title>< ...
- ANSI X9.8标准 PIN xor PAN获取PIN BlOCK
ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 之前看到几篇介绍,把ANSI说成16个字节,真心扯淡,各种误人子弟,真正的ANSI算法其实是8个字节,具体格式如下: (1) AN ...
- JSON资料整理(转)
目录 1.什么是json 2.json语法规则 3.json基础结构 4.json基础示例 5.JSON和XML比较 6. .NET操作JSON 原始方式 通用方式 内置方式 契约方式 通过序列化将. ...
- HDU 3743 Frosh Week(归并排序求逆序数)
归并排序求逆序数 #include <iostream> #include <cstdio> using namespace std; #define maxn 1000005 ...
- JS对象引用
对象和函数都是引用的关系(改变后者会改变前者) 但是下面这个列子情况不一样了.刚开始的时候 B 引用了 A的地址,后来B又重新赋值,新占了一个地址,A B俩的关系已经脱离. 那么有的时候,我们只有 ...