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.项目文件结构 ...
随机推荐
- POJ 1845 Sumdiv (整数拆分+等比快速求和)
当我们拆分完数据以后, A^B的所有约数之和为: sum = [1+p1+p1^2+...+p1^(a1*B)] * [1+p2+p2^2+...+p2^(a2*B)] *...*[1+pn+pn^2 ...
- Dev之ChartControl控件(二)— 绘制多重坐标图形
有时针对一个ChartControl控件可能要设置多个Y轴,进行显示: 以下举个例子:如在一个Chart中显示多个指标项如图: 首先,读取数据,并对左边的Y轴最大和最小值进行设定 IndexSerie ...
- JavaScript算法与数据结构知识点记录
JavaScript算法与数据结构知识点记录 zhanweifu
- git rebase 使用
git rebase 不会取回代码 要用git fetch先取回, git rebase 是合并代码. (1)首先用git fetch返回服务器上的代码 (2)首先用git rebase origin ...
- JSP内置对象--web安全性及config对象的使用 (了解即可)
tomcat服务器配置的时候,在虚拟目录中必须存在一个WEB-INF文件夹,但是访问的时候并不能发现这个文件夹.改成WEB-INFs就可以看到. 所以WEB-INF文件夹不轻易让用户看到,那么其安全性 ...
- zf-关于查询机把index.jsp换成index_new.jsp页面之后把功能链接都改成新页面的简单方法
一开始我都是找action 然后一个一个的改 把onmousedown="goURL('index.jsp')" 改成 onmousedown="goURL('index ...
- (转)Eclipse中使用Ant
Eclipse中使用Ant 分类: JAVA 工具 服务器2014-08-05 09:59 5507人阅读 评论(0) 收藏 举报 anteclipse http://286.iteye.com/bl ...
- Android------>TableLayout表格布局方式
main.xml表格代码分析 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmln ...
- hihoCoder 1252 Kejin Game
2015 ACM / ICPC 北京站 D题 网络最大流 和同学讨论了一会儿,还是Xiang578机智... ... /* ************************************** ...
- 10、end关键字和Fibonacci series: 斐波纳契数列
# Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 #复合赋值表达式,a,b同时赋值0和1 while b < 10: print(b ...