码迷,mamicode.com
首页 > 其他好文 > 详细

Block支持的UIAlertView

时间:2014-07-14 22:33:49      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:blog   http   使用   os   io   代码   

开发IOS时经常会使用到UIAlertView类,该类提供了一种标准视图,可向用户展示警告信息。当用户按下按钮关闭该视图时,需要用委托协议(Delegate protocol)来处理此动作,但是要设置好这个委托协议,就得把创建警告视图和处理按钮动作的代码分开。

UIAlertView *inputAlertView = [[UIAlertView alloc] initWithTitle:@"Add a new to-do item:" message:nil delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:@"Add", nil];

//UIAlertViewDelegate protocol method

- (void)alertView:(UIAlertView *)alertView clickButtonAtButtonIndex:(NSInteger)buttonIndex {

  if (buttonIndex == 0) {

    [self doCancel];

  } else {

  [self doContinue];

 }

}

假如想在一个类中处理多个UIAlertView,那么代码会更加复杂,需要在delegate方法中加入对AlertView的tag的判断。

如果能在创建UIAlertView时把处理每个按钮的逻辑写好,那就简单多了,我们可以使用BLOCK来完成。

一、使用Category +Associate Object +Block

//UIAlertView+FHBlock.h

typedef void (^FHAlertViewCompletionBlock)(UIAlertView *alertView, NSInteger buttonIndex);

@interface UIAlertView (FHBlock) <UIAlertViewDelegate>

@property(nonatomic,copy) FHAlertViewCompletionBlock completionBlock;

@end

 

 

//UIAlertView+FHBlock.m

#import <objc/runtime.h>

@implementation UIAlertView (FHBlock)<UIAlertViewDelegate>

- (void)setCompletionBlock:(FHAlertViewCompletionBlock)completionBlock {

  objc_setAssociatedObject(self, @selector(completionBlock), completionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);

  if (completionBlock == NULL) {

    self.delegate = nil;

  }

  else {

    self.delegate = self;

  }

}

- (FHAlertViewCompletionBlock)completionBlock {

  return objc_getAssociatedObject(self, @selector(completionBlock));

}

 

#pragma mark - UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView clickButtonAtButtonIndex:(NSInteger)buttonIndex {

  if (self.completionBlock) {

    self.completionBlock(self, buttonIndex);

  }

}

@end

 

二、inheritance+Block

//FHAlertView.h

typedef void(^AlertBlock)(UIAlert* alert,NSInteger buttonIndex);

@interface FHAlertView:UIAlertView

@property(nonatomic,copy) AlertBlock completionBlock;

 

//FHAlertView.m

#pragma mark - UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView clickButtonAtButtonIndex:(NSInteger)buttonIndex {

  if (self.completionBlock) {

    self.completionBlock(self, buttonIndex);

  }

}

@end

 

可以参考源码:http://blog.projectrhinestone.org/preventhandler/

Block支持的UIAlertView,布布扣,bubuko.com

Block支持的UIAlertView

标签:blog   http   使用   os   io   代码   

原文地址:http://www.cnblogs.com/lovelanjuan/p/3842368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!