如何执行 UIAlertAction 的处理程序?

How can I perform the handler of a UIAlertAction?

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

我试图通过在名为 handlers

的 属性 中保留一个 UIAlertAction 数组来实现这一点
@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 header 只是:

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

是否有其他方法可以执行 UIAlertActionhandler 块中的代码?

Wrapper class 很棒,嗯?

.h:

@interface UIAlertActionWrapper : NSObject

@property (nonatomic, strong) void (^handler)(UIAlertAction *);
@property (nonatomic, strong) NSString *title;
@property (nonatomic, assign) UIAlertActionStyle style;
@property (nonatomic, assign) BOOL enabled;

- (id) initWithTitle: (NSString *)title style: (UIAlertActionStyle)style handler: (void (^)(UIAlertAction *))handler;

- (UIAlertAction *) toAlertAction;

@end

并在 .m 中:

- (UIAlertAction *) toAlertAction
{
    UIAlertAction *action = [UIAlertAction actionWithTitle:self.title style:self.style handler:self.handler];
    action.enabled = self.enabled;
    return action;
}

...

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

您所要做的就是确保将 UIAlertActionWrappers 插入 helpers 而不是 UIAlertActions。

这样,您可以让所有的属性都可获取和可设置,并且仍然保留原始 class 提供的功能。

经过一些实验,我才明白这一点。原来handler块可以转为函数指针,函数指针可以执行

喜欢

//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);