我正在尝试使用文本编辑,确定和取消按钮设置一个非常简单的UIAlertView
,并且我想根据文本编辑的内容禁用“确定”按钮。
为了能够保留委托,以便他不会在警报视图之前消失(因此一旦用户对警报视图执行某些操作就会导致崩溃),我已将其子类化。现在,我希望能够将otherButtonTitles
参数从我的init方法转发到UIAlertView
init方法,但出于某些原因,只需这样做:
- (id)initWithTitle:(NSString *)title
message:(NSString*)message
delegate:(id /*<UIAlertViewDelegate>*/)delegate
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ... {
if (self = [super initWithTitle:title
message:message
delegate:delegate
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:otherButtonTitles, nil]) {
//stuff
}
仅将args的第一个元素添加到警报视图。我发现我实际上可以使用以下方法手动将按钮添加到警报视图中:
va_list args;
va_start(args, otherButtonTitles);
for (NSString *buttonTitle = otherButtonTitles; buttonTitle != nil; buttonTitle = va_arg(args, NSString*)) {
[self addButtonWithTitle:buttonTitle];
}
va_end(args);
但是,我的alertViewShouldEnableFirstOtherButton
委托方法不再被调用,with the probable explanation in this post。
因此,如何正确地将otherButtonTitles
正确转发到UIAlertView
init方法?
答案 0 :(得分:0)
让我们减少击键次数:
NSMutableArray *otherButtonTitles = [NSMutableArray array];
// .. collect varargs into ^^^
#define T(n) ([otherButtonTitles objectAtIndex:n])
#define CASE(n, ...) case n: self = [super initWithTitle:title \
message:message \
delegate:delegate \
cancelButtonTitle:cancelButtonTitle \
otherButtonTitles:__VA_ARGS__, nil]; \
break
switch ([otherButtonTitles count]) {
CASE(0, nil);
CASE(1, T(0));
CASE(2, T(0), T(1));
CASE(3, T(0), T(1), T(2));
// ... repeat until bored ...
default: @throw @"too many buttons"; // or return nil
}