zoukankan      html  css  js  c++  java
  • 从零开始学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!按钮,警告框消失。

     

    这篇的内容可能对高手来说很容易,但是对刚刚入门的新手来说,可能会产生疑惑,至少我是学了比较长的时间,而且在网上找了很多资料慢慢理解,才稍微有点了解,望各位高手能够提出宝贵意见,谢谢!

     

  • 相关阅读:
    MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
    MyBatis学习总结(三)——优化MyBatis配置文件中的配置
    MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
    MyBatis学习总结(一)——MyBatis快速入门
    web开发工具IDE
    mysql可视化管理工具
    mysql慢查询
    optimize table
    yii2 安装
    JavaScript中将JSON的字符串解析成JSON数据格式
  • 原文地址:https://www.cnblogs.com/lovewx/p/3741443.html
Copyright © 2011-2022 走看看