转发UIAlertView的可变参数

我正在尝试设置一个非常简单的UIAlertView ,带有文本编辑,Ok和取消按钮,我想根据文本编辑的内容禁用Ok按钮。

为了能够保留委托,以便他不会在警报视图之前消失(因此一旦用户使用警报视图执行某些操作就会导致崩溃),我已将其子类化。 现在,我希望能够将我的init方法中的otherButtonTitles参数转发到UIAlertView init方法,但由于某些原因,只需这样做:

 - (id)initWithTitle:(NSString *)title message:(NSString*)message delegate:(id /**/)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委托方法不再被调用, 在这篇文章中可能有解释

因此,如何正确地将我的otherButtonTitles正确otherButtonTitlesUIAlertView init方法?

让我们减少击键:

 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 }