自定义UIAlertController

一、首先来看一下效果图

二、具体实现

我们参照系统的alertController的创建方法来写我们自定义的alertController。

1.首先创建一个xib文件,这个文件作为我们自定义的alertview的视图文件,然后创建与之对应的cococlass文件。

2.然后写一个类方法方面外界创建我们自定义的弹窗:

//LSRAlertView.m
+(LSRAlertView *)alertWithTitle:(NSString *)title andTitleImageName:(NSString *)imageName{
    LSRAlertView * view  = [[[NSBundle mainBundle]loadNibNamed:@"LSRAlertView" owner:self options:nil]firstObject];
    //为保证安全,需要判断参数是否完整
    if (!imageName||![imageName isEqual:@""]) {
        view.titleImageView.image = [UIImage imageNamed:imageName];
    }
    if (!title||![title isEqual:@""]) {
        view.messageLabel.text = title;
    }
    return view;
}

这和系统的创建alertController的方法类似,接着我们将xib文件中需要关联的子控件关联到这个类中(一般将这些子控件放到.m文件中,然后再头文件中给出相应的接口)。

3.然后定义两个方法,方便外界调用来显示隐藏自定义的视图:

//LSRAlertView.m
- (void)show{
    //将这个视图添加到最外层的视图上,就是  UIWindow-->addSubView;
    //1.首先找到当前这个应用的代理
    AppDelegate * delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //2.然后根据代理找到当前这个窗口
    self.frame = [UIScreen mainScreen].bounds;
    [delegate.window addSubview:self];
}
-(void)dismiss{
    [self removeFromSuperview];
}

在show函数中,我们首先获取到了这个app的代理,然后通过代理去找当前这个窗口,因为 UIWindow是继承于UIView,所以我们将我们的视图添加到window上,这样我们的视图就和 rootviewcontroller 处于同一层级了:

4.这个时候我们就可以在viewcontroller中将这个自定义的alertView显示出来了:

//viewcontroller.m
- (IBAction)buttonDidClicked:(UIButton *)sender {
    
    LSRAlertView * view = [LSRAlertView alertWithTitle:@"操作完成" andTitleImageName:@"gou"];
    //在这个控制器中如果需要这个view回调的数据就需要使用block,由于这个界面是需要数据的一方,所以就在
    //这里写block的具体操作,然后将这个block作为参数传回LSRAlertView中,在那个类里面具体调用block
    [view addTopButtonWithTitle:@"确定" andHandle:^(NSString *parameter) {
        NSLog(@"%@",parameter);
    }];
    [view addBottomButtomWithTitle:@"取消" andHandle:^(NSString *parameter) {
        NSLog(@"%@",parameter);
    }];
    [view show];
}

关于其中block的部分下面会介绍到。

5.然后为视图中的按钮控件添加事件,这个时候我们希望按钮点击后,viewcontroller 会接收到相应的信息或者数据,这就是数据回调,这里我们使用block来实现数据的回调。

//LSRAlertView.m
- (IBAction)topButonClicked:(UIButton *)sender {
    /**调用传递过来的block*/
    self.sureBlock(@"第一个按钮被点击了");
}
- (IBAction)bottomButtonClicked:(UIButton *)sender {
    /**调用传递过来的block*/
    self.cancelBlock(@"第二个按钮被点击了");
    [self dismiss];
}
-(void)addTopButtonWithTitle:(NSString *)title andHandle:(SureBtnClickedBlock)block{
    //设置按钮的标题
    [self.optiononeButton setTitle:title forState:UIControlStateNormal];
    //保存传递过来的代码块
    self.sureBlock = block;
}
-(void)addBottomButtomWithTitle:(NSString *)title andHandle:(CancelBtnClickedBlock)blcok{
    [self.optiontwoButton setTitle:title forState:UIControlStateNormal];
    self.cancelBlock = blcok;
}

我们定义两个添加按钮动作的方法,这些个方法带了两个参数,一个是按钮的title,另一个就是block,block实际上就是一个代码块,和函数一样,调用就会执行其中的代码。我们写这两个方法,当在viewcontroller中调用这两个方法时,就会传递给alertView对应按钮控件一个block,然后我们在这两个方法中定义了两个block属性变量,用来保存传递过来的block,可以理解为传递了block代码块在内存中的地址。然后按钮点击触发后就像调用函数那样调用block,这样就会去到viewcontroller中执行定义的block代码块,顺带将这个类中的信息作为参数传递过去,我们这里就简单地打印了传递过来的数据:

三、总结

自定义alerrtController的步骤如下:

  1. 创建xib文件和与之对应的cocoaclass文件用于管理xib文件中的视图。
  2. 仿照系统某个视图的创建方法,给自定义的视图文件定义相关的方法
  3. 实现子控件事件的方法,如果有数据回调,可以用block进行回调。
发布了32 篇原创文章 · 获赞 8 · 访问量 9570
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览