如何执行UIAlertAction的处理程序?

时间:2015-04-21 13:42:58

标签: ios objective-c objective-c-blocks uialertviewdelegate uialertaction

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

我试图通过在名为UIAlertAction

的属性中保留handlers数组来实现此目的
@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 属性,或者确实有任何我可以看到的属性。

handler

还有其他方法可以在UIAlertAction的{​​{1}}块中执行代码吗?

2 个答案:

答案 0 :(得分:5)

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

喜欢这样

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

答案 1 :(得分:0)

包装类很棒,是吗?

.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);
}

您所要做的就是确保将UIAlertActionWrapper插入helpers而不是UIAlertAction

通过这种方式,您可以使所有属性都可以根据您的内容获取和设置,并且仍然保留原始类提供的功能。