IOS 4中Block实战之UIActionSheet是本文介绍的内容,Block是IOS 4的新东西,有了它,源码的逻辑将更清楚,代码的可读性将提高 。熟悉函数指针的朋友对Block不会感冒的,因为它们实质是一样的,只是叫清一不样 。今天将实战BLOCK,我们将封装一个支持Block的UIActionSheet 。好了废话少说,直接上代码:
- PLActionSheet.h
-
- #import <UIKit/UIKit.h>
-
- /**
- * A simple block-enabled API wrapper on top of UIActionSheet.
- */
- @interface PLActionSheet : NSObject <UIActionSheetDelegate> {
- @private
- UIActionSheet *_sheet;
- NSMutableArray *_blocks;
- }
-
- - (id) initWithTitle: (NSString *) title;
-
- - (void) setCancelButtonWithTitle: (NSString *) title block: (void (^)()) block;
- - (void) addButtonWithTitle: (NSString *) title block: (void (^)()) block;
-
- - (void) showInView: (UIView *) view;
-
- @end
- #import <UIKit/UIKit.h>
-
- /**
- * A simple block-enabled API wrapper on top of UIActionSheet.
- */
- @interface PLActionSheet : NSObject <UIActionSheetDelegate> {
- @private
- UIActionSheet *_sheet;
- NSMutableArray *_blocks;
- }
-
- - (id) initWithTitle: (NSString *) title;
-
- - (void) setCancelButtonWithTitle: (NSString *) title block: (void (^)()) block;
- - (void) addButtonWithTitle: (NSString *) title block: (void (^)()) block;
-
- - (void) showInView: (UIView *) view;
-
- @end
- PLActionSheet.m
-
- #import "PLActionSheet.h"
-
- @implementation PLActionSheet
-
- - (id) initWithTitle: (NSString *) title {
- if ((self = [super init]) == nil)
- return nil;
-
- /* Initialize the sheet */
- _sheet = [[UIActionSheet alloc] initWithTitle: title delegate: self cancelButtonTitle:
- nil destructiveButtonTitle: nil otherButtonTitles: nil];
-
- /* Initialize button -> block array */
- _blocks = [[NSMutableArray alloc] init];
-
- return self;
- }
-
- - (void) dealloc {
- _sheet.delegate = nil;
- [_sheet release];
-
- [_blocks release];
-
- [super dealloc];
- }
- - (void) setCancelButtonWithTitle: (NSString *) title block: (void (^)()) block {
- [self addButtonWithTitle: title block: block];
- _sheet_sheet.cancelButtonIndex = _sheet.numberOfButtons - 1;
- }
-
- - (void) addButtonWithTitle: (NSString *) title block: (void (^)()) block {
- [_blocks addObject: [[block copy] autorelease]];
- [_sheet addButtonWithTitle: title];
- }
-
- - (void) showInView: (UIView *) view {
- [_sheet showInView: view];
-
- /* Ensure that the delegate (thats us) survives until the sheet is dismissed */
- [self retain];
- }
-
- - (void) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex {
- /* Run the buttons block */
- if (buttonIndex >= 0 && buttonIndex < [_blocks count]) {
- void (^b)() = [_blocks objectAtIndex: buttonIndex];
- b();
- }
-
- /* Sheet to be dismissed, drop our self reference */
- [self release];
- }
-
- @end
- #import "PLActionSheet.h"
-
- @implementation PLActionSheet
-
- - (id) initWithTitle: (NSString *) title {
- if ((self = [super init]) == nil)
- return nil;
-
- /* Initialize the sheet */
- _sheet = [[UIActionSheet alloc] initWithTitle: title delegate: self cancelButtonTitle:
- nil destructiveButtonTitle: nil otherButtonTitles: nil];
- /* Initialize button -> block array */
- _blocks = [[NSMutableArray alloc] init];
-
- return self;
- }
-
- - (void) dealloc {
- _sheet.delegate = nil;
- [_sheet release];
-
- [_blocks release];
-
- [super dealloc];
- }
-
- - (void) setCancelButtonWithTitle: (NSString *) title block: (void (^)()) block {
- [self addButtonWithTitle: title block: block];
- _sheet_sheet.cancelButtonIndex = _sheet.numberOfButtons - 1;
- }
-
- - (void) addButtonWithTitle: (NSString *) title block: (void (^)()) block {
- [_blocks addObject: [[block copy] autorelease]];
- [_sheet addButtonWithTitle: title];
- }
-
- - (void) showInView: (UIView *) view {
- [_sheet showInView: view];
-
- /* Ensure that the delegate (thats us) survives until the sheet is dismissed */
- [self retain];
- }
-
- - (void) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex {
- /* Run the buttons block */
- if (buttonIndex >= 0 && buttonIndex < [_blocks count]) {
- void (^b)() = [_blocks objectAtIndex: buttonIndex];
- b();
- }
-
- /* Sheet to be dismissed, drop our self reference */
- [self release];
- }
-
- @end
用法如下:
- - (void) displaySheet {
- PLActionSheet *sheet = [[PLActionSheet alloc] initWithTitle: @"Destination"];
- /* A re-usable block that simply displays an alert message */
- void (^alert)(NSString *) = ^(NSString *message) {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Destination Selected"
- message: message
- delegate: nil
- cancelButtonTitle: @"OK"
- otherButtonTitles: nil];
- [alert show];
-
- [alert release];
- };
- [sheet addButtonWithTitle: @"Work" block: ^{
- alert(@"Work selected");
- }];
- [sheet addButtonWithTitle: @"Home" block: ^{
- alert(@"Home selected");
- }];
- [sheet addButtonWithTitle: @"School" block: ^{
- alert(@"School selected");
- }];
- [sheet setCancelButtonWithTitle: @"Cancel" block: ^{}];
-
- [sheet showInView: self.window];
- [sheet release];
- }
- - (void) displaySheet {
- PLActionSheet *sheet = [[PLActionSheet alloc] initWithTitle: @"Destination"];
- /* A re-usable block that simply displays an alert message */
- void (^alert)(NSString *) = ^(NSString *message) {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Destination Selected"
- message: message
- delegate: nil
- cancelButtonTitle: @"OK"
- otherButtonTitles: nil];
- [alert show];
- [alert release];
- };
-
- [sheet addButtonWithTitle: @"Work" block: ^{
- alert(@"Work selected");
- }];
- [sheet addButtonWithTitle: @"Home" block: ^{
- alert(@"Home selected");
- }];
- [sheet addButtonWithTitle: @"School" block: ^{
- alert(@"School selected");
- }];
- [sheet setCancelButtonWithTitle: @"Cancel" block: ^{}];
- [sheet showInView: self.window];
- [sheet release];
- }
采用BLOCK的方法,源码可读性大大增强 。如果我们在同一个Controller里需要多个UIActionSheet, 而只有一个delegate方法,那在这个delegate方法里就要跟踪现在是哪一个UIActionSheet,这样就会有很多if else的代,也难于维护 。以后将多采用BLOCK来写程序了 。
小结:IOS 4中Block实战之UIActionSheet的内容介绍完了,希望本文对你有所帮助!