ios – 如何执行UIAlertAction的处理程序?

我正在尝试编写一个帮助类,以允许我们的应用程序同时支持UIAlertAction和UIAlertView.但是,在为UIAlertViewDelegate编写alertView:clickedButtonAtIndex:方法时,我遇到了这个问题:我看不到在UIAlertAction的处理程序块中执行代码方法.

我试图通过在称为处理程序的属性中保留一组UIAlertActions来做到这一点

@property (nonatomic,strong) NSArray *handlers;

然后实现这样的委托:

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    UIAlertAction *action = self.handlers[buttonIndex];
    if (action.enabled)
        action.handler(action);
}

但是,没有action.handler属性,或者实际上我可以通过任何方式获取它,因为UIAlertAction标头只有:

NS_CLASS_AVAILABLE_IOS(8_0) @interface UIAlertAction : NSObject <NScopying>

+ (instancetype)actionWithTitle:(Nsstring *)title style:(UIAlertActionStyle)style handler:(void (^)(UIAlertAction *action))handler;

@property (nonatomic,readonly) Nsstring *title;
@property (nonatomic,readonly) UIAlertActionStyle style;
@property (nonatomic,getter=isEnabled) BOOL enabled;

@end

是否有其他方法可以在UIAlertAction的处理程序块中执行代码

解决方法

经过一些实验,我才想到这一点.事实证明,处理程序块可以作为函数指针进行转换,并且可以执行函数指针.

像这样

//Get the UIAlertAction
UIAlertAction *action = self.handlers[buttonIndex];

//Cast the handler block into a form that we can execute
void (^someBlock)(id obj) = [action valueForKey:@"handler"];

//Execute the block
someBlock(action);

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...