从零开始学ios开发(七):Delegate,Action Sheet, Alert
Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从底部弹出,上面有2个或者2个以上的选项供用户选择,Alert就是一个警告框,上面有1个或者1个以上的按钮供用户进行选择。
在继续这一篇的内容之前,稍微花点时间说一下ios中用到的Delegate Pattern(委托\代理模式)。
ios中有很多已经定义好的类可以供我们在编写程序时直接使用,例如UIActionSheet、UIAlertView等,这些类定义了很多method,我们可以调用这些method且不必知道这些method是如何实现的。但是有一个问题,如果我们想改变这些method的实现,那我们该这么做呢?一种方法是继承,我们可以继承一个类,然后在自己的类中重新写method,这是一个方法,但不是一个很方便的方法,有时候你仅仅需要改变很小的一个功能,却要继承一个很大的类,貌似有点复杂了,而且如果你需要一些不同的实现,那你就需要定义好多不同的类,这会很麻烦。为了使开发过程更加的方便,ios使用了另一种方法来达到同样的目的,就是使用delegate,我们使用一个已定义的类,然后使用委托\代理来改写类中的method,程序在运行时,delegate发现你创建了某个类的实例且改写了其中的method,这样程序在运行时就不会去调用原有的实现(当然你也可以调用原有的实现),而是直接调用你写的新的实现,从而达到自定义程序方法的目的。
上面的这个说法可能不够清楚,我自己也觉得比较含糊,那就看下面的例子,来进一步说明如何使用ios中用到的Delegate。
我们继续上一篇的项目,实现button的buttenPressed Action
1)添加<UIActionSheetDelegate>
我们需要在BIDViewController类中使用UIActionSheet,而使用UIActionSheet时我们需要实现其一个delegate(并不是所有的delegate方法都要实现,只要根据实际需求去实现某些method,这个例子中的UIAlertView就不需要实现任何的delegate),但是在BIDViewController类中并没有这个delegate的实现,因此需要手动添加,而在BIDViewController.h中添加<UIActionSheetDelegate>,就是让BIDViewController可以接收并响应UIActionSheet的代理事件。
打开BIDViewController.h,添加<UIActionSheetDelegate>
#import <UIKit/UIKit.h> @interface BIDViewController : UIViewController <UIActionSheetDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *numberField; ......
2)实现buttonPressed
打开BIDViewController.m,找到buttonPressed方法,添加如下代码
- (IBAction)buttonPressed:(id)sender {
UIActionSheet * actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Are you sure?"
delegate:self
cancelButtonTitle:@"No Way!"
destructiveButtonTitle:@"Yes, I'm Sure!"
otherButtonTitles:nil];
[actionSheet showInView:self.view];
}
编译运行,单击“Do Something” button后,一个Action Sheet会从底部弹出,如下
ok,我们根据这个Action Sheet来分析下上面代码中UIActionSheet中的每个参数的意思:
[UIActionSheet alloc]:分配内存空间
initWithTitle:@"Are you sure":ActionSheet的title
delegate:self:指明这个UIActionSheet的代理在哪里,self说明这个代理在本类中,也就是说在UIActionSheet所在的类中寻找UIActionSheet的代理方法的实现(这个例子中的类就是指类BIDViewController)。回过头再去看BIDViewController.h中我们刚刚添加的<UIActionSheetDelegate>,让该类可以接收并响应UIActionSheet的代理事件。
cancelButtonTitle:@"No Way!":取消按钮,用于取消(不继续进行下一步操作),这里设置取消按钮的文字。
destructiveButtonTitle:@"Yes, I'm Sure!":相当于确定按钮(继续下一步操作),这里设置确定按钮的文字。
otherButtonTitles:nil:除了上面的取消按钮和确定按钮外,ActionSheet还可以自定义多个按钮,这里设置其他按钮的文字(例如:otherButtonTitles:@"Foo", @"Bar", nil;最后一个参数一定要写nil,表示结束)。
上面code中的最后一行:
[actionSheet showInView:self.view]
作用是显示actionSheet,每一个ActionSheet都需要有一个parent view,在parent view中显示自己,因为我们是单一视图项目(Single View),也只有一个View,因此这里的self.view就是说在actionSheet实现的这个view里显示。
3)实现actionSheet delegate方法
在BIDViewController.m中的buttonPressed方法下面添加如下code
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if(buttonIndex != [actionSheet cancelButtonIndex])
{
NSString *msg = nil; if(nameField.text.length > 0)
msg = [[NSString alloc] initWithFormat:@"You can breathe easy, %@, everything went OK.", nameField.text];
else
msg = @"You can breathe easy, everything went OK."; UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Something was done"
message:msg
delegate:self
cancelButtonTitle:@"Phew!"
otherButtonTitles:nil]; [alert show];
}
}
上面的code实现了一个Action Sheet的delegate:didDismissWithButtonIndex,当点击actionSheet按钮时,会调用到该delegate,而不会去调用其原有的方法。在该方法中,首先判断用户没有点击cancelButton(根据button的Index来判断),如果确实没有点击cancelbutton(点击了destructiveButton,因为只有2个button),就显示一个警告框。
UIAlertView的参数说明:
[UIAlertView alloc]:分配内存空间
initWithTitle:@"Something was done":Alert的title
message:msg:Alert的文字
delegate:self:作用和ActionSheet中的类似,只是UIAlertView没有实现任何delegate方法,因此我们也没有在头文件中引入<UIAlertViewDelegate>
cancelButtonTitle:@"Phew!":取消按钮,可以看作是关闭Alert窗口的按钮,然后什么操作都不继续。
otherButtonTitles:nil:作用和ActionSheet中的一样
总的来看,UIAlertView和UIActionSheet的实现相当类似,可以对比着进行学习。
4)编译运行
点击Do Something按钮,显示ActionSheet
点击No Way!按钮,ActionSheet消失,点击Yes,I'm Sure!按钮,ActionSheet消失,然后显示一个警告框
如果在nameField中填写一些内容,则Alert中会显示
点击Phew!按钮,警告框消失。
这篇的内容可能对高手来说很容易,但是对刚刚入门的新手来说,可能会产生疑惑,至少我是学了比较长的时间,而且在网上找了很多资料慢慢理解,才稍微有点了解,望各位高手能够提出宝贵意见,谢谢!
从零开始学ios开发(七):Delegate,Action Sheet, Alert的更多相关文章
- 从零开始学 iOS 开发的15条建议
事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交 ...
- 从零开始学IOS开发
从今天开始开一个坑,由于业务变动,要开始学习IOS开发进行IOS app开发,其实鄙人本身就是一只菜鸟加大学狗,有过两年的C#,ASP.NET MVC,微信公众平台开发经验,一只在继续努力着,从大三下 ...
- 从零开始学ios开发(三):第一个有交互的app
感谢大家的关注,也给我一份动力,让我继续前进.有了自己的家庭有了孩子,过着上有老下有小的生活,能够挤出点时间学习真的很难,每天弄好孩子睡觉已经是晚上10点左右了,然后再弄自己的事情,一转眼很快就到12 ...
- 从零开始学ios开发(一):准备起航
首先介绍一下自己的背景,本人09年研究生毕业,大学就不介绍了,反正是上海的一所211大学,学的是计算机科学与技术专业,学生时代,从事过ACM,没有什么太大的成就,中国的牛人是在太多,我的水平,估计连高 ...
- 从零开始学ios开发(六):IOS控件(3),Segmented Control、Switch
这次的学习还是基于上一个项目继续进行(你也可以新建一个项目)学习Segmented Control和Switch. Segmented Control Switch Segmented Control ...
- 从零开始学ios开发(四):IOS控件(1),Image View、Text Field、Keyboard
长话短说,谢谢大家的关注,这篇写了好长时间,下面继续学习ios.我将用2到3篇的篇幅来学习iphone上的一些常用控件,包括Image View.Text Field.Keyboard.Slider等 ...
- 从零开始学ios开发(十一):Tab Bars和Pickers
不好意思各位,本人休息了一个礼拜,所以这次的进度延后了,而且这次的学习的内容比较多,时间用的也比较长,文章发布的时间间隔有些长了,望各位谅解,下面继续我们的ios之旅. 这次我们主要学习的内容有2个, ...
- 从零开始学ios开发(十):Multiview Applications(多个xib之前的切换)
这篇学习的主要内容是Multiview,在我们学习iphone旋转的时候,介绍过多个view的使用方法,不过这里的view和旋转屏幕中所指的多个view是不同的,旋转屏幕中涉及到的多个view是在一个 ...
- 从零开始学ios开发(二十):Application Settings and User Defaults(下)
在上一篇的学习中,我们知道了如何为一个App添加它的Settings设置项,在Settings设置项中我们可以添加哪些类型的控件,这些控件都是通过一个plist来进行管理的,我们只需对plist进行修 ...
随机推荐
- Unity3d之按键
if (Input.GetKeyDown(KeyCode.A)){ Debug.Log("您按下了A键"); } if (Input.GetKeyUp(KeyCode.A)) { ...
- JS辨别浏览器系统IOS或安卓
详细内容请点击 /* * 智能机浏览器版本信息: * */ (function($,window,document){ $.extend({ browser:{ ...
- 基于ASP.Net +easyUI框架上传图片,判断格式+实现即时浏览
<div> 选择图片:<input id="idFile" style="width:224px" runat="server&qu ...
- ubuntu笔记1
修改grub启动项顺序 在/etc/grub.d/ 目录下 文件前序号越小 在启动界面顺序越靠前, 用sudo mv修改文件名, sudo update-grub更新
- php删除数组中相同的元素,只保留一个相同元素
<?php// 删除数组中相同元素,只保留一个相同元素function formatArray($array){sort($array);$tem = ”;$temarray = array() ...
- C语言知识总结(4)
变量的作用域 C语言根据变量作用域的不同,将变量分为局部变量和全局变量 1.局部变量 1> 定义:在函数内部定义的变量,称为局部变量.形式参数也属于局部变量. 2> 作用域:局部变量只在定 ...
- Python 字典(Dictionary) setdefault()方法
描述 Python 字典(Dictionary) setdefault() 函数和get()方法类似, 如果键不已经存在于字典中,将会添加键并将值设为默认值. 语法 setdefault()方法语法: ...
- javaScript中的数组迭代方法
ECMAScript5为数组定义了5个迭代方法. 每个方法都接收两个参数:要在每一项上运行的函数 和 (可选的)运行该函数的作用域对象. 传入这些方法中的函数会接收三个参数:数组项的值,该项在数组 ...
- 8个WEB前端创意HTML5动画应用精选
和十几年前相比,现在的网页加入了很多动画元素,从之前的Flash到现在的HTML5,动画样式越来越丰富,动画制作也越来越便捷.本文精选了几款非常富有创意的HTML5动画应用,欣赏一下吧. 1.HTML ...
- 判断不在Update Task中
CALL FUNCTION 'TH_IN_UPDATE_TASK' IMPORTING IN_UPDATE_TASK = IN_UPDATE_TASK. "0 then not ...