iosobjective-cobjective-c-blocksuialertviewdelegateuialertaction

How can I perform the handler of a UIAlertAction?


I'm trying to write a helper class to allow our app to support both UIAlertAction and UIAlertView. However, when writing the alertView:clickedButtonAtIndex: method for the UIAlertViewDelegate, I came across this issue: I see no way to execute the code in the handler block of a UIAlertAction.

I'm trying to do this by keeping an array of UIAlertActions in a property called handlers

@property (nonatomic, strong) NSArray *handlers;

and then implement a delegate like such:

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

However, there is no action.handler property, or indeed any way I can see to fetch that, since the UIAlertAction header just has:

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

Is there some other way to execute the code in the handler block of a UIAlertAction?


Solution

  • After some experimentation I just figured this out. Turns out that the handler block can be cast as a function pointer, and the function pointer can be executed.

    Like so

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