转发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
正确otherButtonTitles
到UIAlertView
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 }