如何执行 UIAlertAction 的处理程序?
How can I perform the handler of a UIAlertAction?
我正在尝试编写一个帮助程序 class 以允许我们的应用程序同时支持 UIAlertAction
和 UIAlertView
。但是,在为 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
是否有其他方法可以执行 UIAlertAction
的 handler
块中的代码?
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);
}
您所要做的就是确保将 UIAlertActionWrapper
s 插入 helpers
而不是 UIAlertAction
s。
这样,您可以让所有的属性都可获取和可设置,并且仍然保留原始 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);
我正在尝试编写一个帮助程序 class 以允许我们的应用程序同时支持 UIAlertAction
和 UIAlertView
。但是,在为 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
是否有其他方法可以执行 UIAlertAction
的 handler
块中的代码?
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);
}
您所要做的就是确保将 UIAlertActionWrapper
s 插入 helpers
而不是 UIAlertAction
s。
这样,您可以让所有的属性都可获取和可设置,并且仍然保留原始 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);