runtime之添加属性+点击空白隐藏UIAlertView

原创 2018年04月17日 14:47:24

问题:接手了一个项目没多久,今天测试提交了一个bug,算是逻辑上的bug吧。前台收到了mqtt发送过来的一个消息,然后用UIAlertView显示了一个弹框,上面有“加入”和“拒绝”两个按钮可以选择。也就是说,用户在某一个页面进行着某一项操作突然弹出了一个提示框,并且我必须选其一。但是如果用户不想现在决定,就需要隐藏这个弹窗,此时并没有取消按钮,所以就产生了一个需求:点击UIAlertView的黑色背景隐藏弹窗。

之前的代码这样的:

UIAlertView *organizationAlert = [[UIAlertView alloc]initWithTitle:nil

                                                    message:[NSString stringWithFormat:@"尊敬的用户,您的平台账号被%@邀请加入,请确认。",notifica.object]

                                                  delegate:self

                                          cancelButtonTitle:@"拒接"

                                          otherButtonTitles:@"加入", nil];

    [kUserDefaults setObject:[NSString stringWithFormat:@"尊敬的用户,您的平台账号被%@邀请加入,请确认。",notifica.object] forKey:@"NotificaObject"];

    [self.organizationAlert show];

现在我想添加一个点击事件,然后在事件里面去dismiss弹窗。这个时候需要把organizationAlert写成属性。问题来了:这一切都是写在类目里面的!

#import "AppDelegate.h"

@interface AppDelegate (Notifies)

@end

明白了吧,在这里添加属性,就需要用到runtime了,这也是runtime需要用的为数不多的应用场景:添加属性。

下面直接放完整代码:

①把弹窗写成属性

#import "AppDelegate.h"@interface AppDelegate (Notifies)

@property (nonatomic, strong) UIAlertView *organizationAlert;

@end

②添加getter setter方法

//strKey 唯一标识

static void *strKey = &strKey;

- (void)setOrganizationAlert:(UIAlertView *)organizationAlert{

    objc_setAssociatedObject(self, &strKey, organizationAlert, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (UIAlertView *)organizationAlert{

    return objc_getAssociatedObject(self, &strKey);

}

③使用

#pragma mark -- 组织邀请

-(void)organizationInvite:(NSNotification *)notifica{

    self.organizationAlert = [[UIAlertView alloc]initWithTitle:nil

                                                    message:[NSString stringWithFormat:@"尊敬的用户,您的平台账号被%@邀请加入,请确认。",notifica.object]

                                                  delegate:self

                                          cancelButtonTitle:@"拒接"

                                          otherButtonTitles:@"加入", nil];

    [kUserDefaults setObject:[NSString stringWithFormat:@"尊敬的用户,您的平台账号被%@邀请加入,请确认。",notifica.object] forKey:@"NotificaObject"];



    [self.organizationAlert show];



    //点击背景隐藏

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    tap.numberOfTapsRequired = 1;

    tap.cancelsTouchesInView = NO;

    [[UIApplication sharedApplication].keyWindow addGestureRecognizer:tap];

}

//点击事件处理

- (void)tap:(UITapGestureRecognizer *)tap

{

    if (tap.state == UIGestureRecognizerStateEnded){//下面代码自己去理解

        CGPoint location = [tap locationInView:nil];

        if (![self.organizationAlert pointInside:[self.organizationAlert convertPoint:location fromView:self.organizationAlert.window] withEvent:nil]){

            [self.organizationAlert.window removeGestureRecognizer:tap];

            [self.organizationAlert dismissWithClickedButtonIndex:0 animated:YES];

        }

    }

}

iOS之UIAlertView点击窗口之外区域关闭

弹出一个UIAlertView,然后点击窗口之外的区域来关闭UIALertView,代码如下: - (IBAction)showAlert:(id)sender { alert = [[UIA...
  • LVXIANGAN
  • LVXIANGAN
  • 2015-04-13 00:17:34
  • 6870

UIAlertView点击背景消失的方法

_phoneAlert = [[UIAlertView alloc]initWithTitle:@"" message:@"请选择要选择的电话" delegate:self cancelButtonT...
  • u011010305
  • u011010305
  • 2016-11-10 13:54:20
  • 610

点击空白处隐藏div方法

一般写法:html点我显示div 我是点击btn后显示的divjQuery// 取消冒泡方法(兼容写法) function cancel_Bubble() { //如果事件对象存在 ...
  • anLazyAnt
  • anLazyAnt
  • 2016-05-16 00:50:50
  • 930

利用runtime实现UIAlertView的block回调

平时我们用UIAlertView需要使用其代理方法来确定我们的点击事件,使用起来不够方便,新的sdk中UIAlertViewController是使用block来访问其点击事件的,那我们就将UIAle...
  • Yxf_Blogger
  • Yxf_Blogger
  • 2016-09-19 15:06:05
  • 438

js点击空白处隐藏div

$(function(){     $(document).bind("click",function(e){         var target = $(e.target);        ...
  • ROVAST
  • ROVAST
  • 2016-03-25 16:42:36
  • 2260

jQuery点击网页任意空白区域隐藏div

JS代码:$(function () { $('#btnShow').click(function (event) { //取消事件冒泡 ev...
  • cddcj
  • cddcj
  • 2017-08-18 12:00:50
  • 410

点击空白区域,div隐藏

当我点击查询条件时,查询条件div显示出来 如下 当我再点击空白区域的时候,查询条件隐藏。 这里面主要是用到一个防止冒泡的功能 $(".rightMenuAlert").click(f...
  • startcodingnoend
  • startcodingnoend
  • 2015-11-17 12:57:34
  • 352

jquery点击空白处隐藏弹出层的写法

jquery点击空白处隐藏弹出层的写法 点击按钮展开弹出层以及点击关闭按钮关闭弹出层的效果,都很简单,但是展开弹出层后点击空白处也能关闭弹出层的效果,一开始对我来说却是有点难度的,研究了一下...
  • xj_li
  • xj_li
  • 2016-05-25 11:09:56
  • 1675

iOS开发之用block来实现UIAlertView点击事件的代理方法

iOS开发之用block来实现UIAlertView点击事件的代理方法
  • GorLong
  • GorLong
  • 2017-03-08 09:40:44
  • 666

jQuery点击空白处隐藏弹出层

一款jQuery点击空白处隐藏弹出层网页特效,点击按钮弹出层、点击页面空白处弹出层消失JS代码。主要功能是点击按钮弹出层显示,然后通过点击页面任意位置都能关闭弹出层显示效果,主要是$(document...
  • Sky786905664
  • Sky786905664
  • 2016-11-23 19:36:09
  • 7393
收藏助手
不良信息举报
您举报文章:runtime之添加属性+点击空白隐藏UIAlertView
举报原因:
原因补充:

(最多只允许输入30个字)