欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【iOS】动作表ActionSheet和警告框AlterView

程序员文章站 2022-05-31 13:26:47
...

动作表ActionSheet和警告框AlterView是iOS中常见的元素,也是app中常见的元素,相当于一个与用户交互的菜单。其实在《【iOS】按钮点击弹窗》(点击打开链接)中介绍的弹窗也是警告框的一种,只是当时以最简单的方式呈现。iOS中的动作表和警告框与《【iOS】表视图》(点击打开链接)同样通过完成iOS要求的指定函数来实现。下面以一个简单的例子,来说明这个问题。

【iOS】动作表ActionSheet和警告框AlterView

如上图所示,用户点击按钮将弹出动作表,之后点击选择项之后,会弹出警告框,然后我们最终能接受到用户点击的是哪个选择项与哪个选择框。以此来说明动作表和警告框的响应事件。

制作过程如下:

1、场景布置就不多说了,一个Round Rect Button、一个Label,注意Label要拖大一点以容纳所有文字,当然默认的文本"Label",清楚Text属性。

【iOS】动作表ActionSheet和警告框AlterView

2、以《【iOS】点击按钮Button,更变标签文字Label的颜色》(点击打开链接)的方式,注册Label为label1,然后Button的点击事件为OnClick。注册之后ViewController.h如下:

//
//  ViewController.h
//  Actionsheet
//
//  Created by pc on 17-6-5.
//  Copyright (c) 2017年 pc. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIAlertViewDelegate,UIActionSheetDelegate>//动作表和警告框的委托,使其响应事件生效
//组件和事件的注册
@property (weak, nonatomic) IBOutlet UILabel *label1;
- (IBAction)OnClick:(id)sender;
@end
这里同时与《【iOS】表视图》(点击打开链接)同样,添加了动作表和警告框的委托,以使其点击事件生效。

3、之后修改ViewController.m如下,这也是全文的精华。

//
//  ViewController.m
//  Actionsheet
//
//  Created by pc on 17-6-5.
//  Copyright (c) 2017年 pc. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//按钮点击事件
- (IBAction)OnClick:(id)sender {
    //初始化动作表,填写一系列基本属性
    UIActionSheet *uiActionSheet = [[UIActionSheet alloc]
                                    initWithTitle:nil
                                    delegate:self
                                    cancelButtonTitle:@"取消"
                                    destructiveButtonTitle:@"警告性选择项"
                                    otherButtonTitles:@"动作表选择项1",@"动作表选择项2",nil];
    uiActionSheet.actionSheetStyle = UIActionSheetStyleDefault;//设置动作表样式,一般默认即可
    [uiActionSheet showInView:self.view];//显示这个动作表
}

//动作表响应事件
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex){//一起按照buttonIndex来,从上到下的按钮的点击事件依次为0-n
        case 0:
            [self showAlert:@"警告性选择项"];
            break;
        case 1:
            [self showAlert:@"动作表选择项1"];
            break;
        case 2:
            [self showAlert:@"动作表选择项2"];
            break;
    }
}

//自定义的showAlert函数,同时带有msg的形式参数
-(void)showAlert:(NSString *)msg {
    //初始化警告框,填写一系列基本属性
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"你选择的动作表选择项为:"
                          message:msg
                          delegate:self
                          cancelButtonTitle:nil
                          otherButtonTitles:@"弹窗按钮1",@"弹窗按钮2",nil];
    [alert setMessage:[[NSString alloc]initWithFormat:@"%@\n",msg]];//设置警告框中的message属性,专门用来和响应事件alertView作数据传递用的
    [alert show];//弹窗
    
}

//警告框的响应事件
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger) buttonIndex
{
    self.label1.numberOfLines = 0;//让\n生效,iOS默认\n换行是不生效的,我也是醉了
    self.label1.text=[[NSString alloc]initWithFormat:@"%@%@%@%d",
                      @"你选择的为:\n",[alertView message],@"弹窗按钮",(buttonIndex+1)];
    
}

@end
需要说明的是,在ViewController.h添加的委托<UIAlertViewDelegate,UIActionSheetDelegate>对应的函数是-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex和- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger) buttonIndex必须要完成,这里大家可能有困惑,一个动作表的选项对应一个警告框,那么警告框有多个,如何识别呢?这里就是通过[alert setMessage:[]]用于识别不同的警告框,如果你要传的是int那就用[alert setTags:[]]。之后可以用[alertView Message]或者[alertView Tags]来取出,从而达到数据传递的效果。