从零开始学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,布布扣,bubuko.com

时间: 2024-08-08 18:46:01

从零开始学ios开发(七):Delegate,Action Sheet, Alert的相关文章

从零开始学ios开发(六):IOS控件(3),Segmented Control、Switch

这次的学习还是基于上一个项目继续进行(你也可以新建一个项目)学习Segmented Control和Switch. Segmented Control Switch Segmented Control和Switch的主要区别在于Segmented Control可以有多个值进行选择,而Switch只有2个值. 1)添加Segmented Control从object library中拖一个Segmented Control到iphone界面上然后调整Segmented Control位置以及它的

从零开始学ios开发(十五):Navigation Controllers and Table Views(中)

这篇内容我们继续上一篇的例子接着做下去,为其再添加3个table view的例子,有了之前的基础,学习下面的例子会变得很简单,很多东西都是举一反三,稍稍有些不同的内容,好了,闲话少说,开始这次的学习. 如果没有上一篇的代码,可以从这里下载Nav_1 1)第三个subtableview:Controls on Table Rows这个例子,我们将为每个table view的每一行添加一个按钮,这个按钮将放在accessory icon的位置(之前我们使用过accessoryType,其实这也是一个

从零开始学ios开发(九):Swapping Views

这篇的内容是切换Views,也是上一篇中提到的第三种当iphone发生旋转后改变布局的方式,先回顾一下上一篇中提到的三种方式 1.使用Autosizing 2.写code 3.重新弄个View,替换原先的View 切换View,顾名思义就是在两个不同的View中间进行切换,那么我们至少需要有2个View,一个View展现当竖着(Portrait)拿iphone时的界面,另一个View展现当横着(Landscape)拿iphone是的界面,当我们旋转iphone时,就在这2个View之间进行切换,

从零开始学ios开发(十八):Storyboards(下)

这篇我们完成Storyboards的最后一个例子,之前的例子中没有view之间的切换,这篇加上这个功能,使Storyboards的功能完整呈现.在Storyboards中负责view切换的东西叫做“segue”,只需对它进行简单的设置即可,一切都是傻瓜式的,无需繁琐的代码.好了,开始我们的例子吧. 1)Create a Simple Storyboard创建一个project,左边选择Application,右边选择Empty Application template(我们这里不使用Single

从零开始学ios开发(十):Multiview Applications(多个xib之前的切换)

这篇学习的主要内容是Multiview,在我们学习iphone旋转的时候,介绍过多个view的使用方法,不过这里的view和旋转屏幕中所指的多个view是不同的,旋转屏幕中涉及到的多个view是在一个xib文件中的,而我们这里所指的mulitview,则是指多个xib,在多个xib中进行view的切换,也就是从一个xib切换到另一个xib,而每个xib中只有一个view. 另外的一个不同点体现在创建项目的时候,到目前为止,我们创建的所有项目的template都是single view,这次创建的

从零开始学ios开发(十一):Tab Bars和Pickers

不好意思各位,本人休息了一个礼拜,所以这次的进度延后了,而且这次的学习的内容比较多,时间用的也比较长,文章发布的时间间隔有些长了,望各位谅解,下面继续我们的ios之旅. 这次我们主要学习的内容有2个,一个是Tab Bar,如下图 很熟悉的界面(iphone中的phone),另一个Picker,如下图 在正是开始学习项目之前,先首先简单介绍一下这次的例子的一个结构,当然一个root controller肯定是有的,用来控制其他subController的切换,在root controller中会放

从零开始学ios开发(十四):Navigation Controllers and Table Views(上)

这一篇我们将学习一个新的控件Navigation Controller,很多时候Navigation Controller是和Table View紧密结合在一起的,因此在学习Navigation Controller的同时,我们还将继续学习Table View其他一些特性,毕竟Navigation Controller还是相对来说毕竟简单的,没有什么太大的花头,它的主要作用就是一个view的切换,切来切去,而Table View的花头就比较多了,这次我们将这2个控件结合在一起进行学习. 再多说一

从零开始学ios开发(十二):Table Views(中)UITableViewCell定制

我们继续学习Table View的内容,这次主要是针对UITableViewCell,在前一篇的例子中我们已经使用过UITableViewCell,一个默认的UITableViewCell包含imageView.textLabel.detailTextLabel等属性,但是很多时候这些默认的属性并不能满足需要,其实更多的时候我们想自己制定UITableViewCell的内容,这篇学习的就是制定自己的UITableViewCell. UITableViewCell继承自UIView,因此它可以加载

从零开始学ios开发(五):IOS控件(2),Slider

下面继续学习ios的其他控件,这次会使用到的控件有Slider,当然还有一些之前已经使用过的控件Label. 这次我们不新建一个project了,当然如果你愿意重新创建一个新的项目也完全可以,我们还是使用上一篇的项目Control Fun. 上一篇中,我们最后的成果如下图所示我们添加了一个ImageView,2个Label和2个TextField,现在我们继续在此基础上添加其他的控件. 1)添加Slider和LabelSlider类似于一个滑块,左右(或者上下)滑动来改变数值,在object l