Вы не можете сделать это, по крайней мере, не так, как вы хотите. То, что вы хотите сделать (передать аргументы переменной), требует инициализатора на UIAlertView
, который принимает va_list
. Там нет ни одного. Однако вы можете использовать метод addButtonWithTitle:
:
+ (void)showWithTitle:(NSString *)title
message:(NSString *)message
delegate:(id)delegate
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ...
{
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:title
message:message
delegate:delegate
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:nil] autorelease];
if (otherButtonTitles != nil) {
[alert addButtonWithTitle:otherButtonTitles];
va_list args;
va_start(args, otherButtonTitles);
NSString * title = nil;
while(title = va_arg(args,NSString*)) {
[alert addButtonWithTitle:title];
}
va_end(args);
}
[alert show];
}
Это, конечно, очень специфично для проблемы. Реальный ответ таков: «Вы не можете неявно передать список переменных аргументов методу / функции, у которых нет параметра va_list
». Поэтому вы должны найти способ обойти проблему. В приведенном вами примере вы хотели создать alertView с заголовками, которые вы передали. К счастью для вас, класс UIAlertView
имеет метод, который вы можете итеративно вызывать для добавления кнопок и, таким образом, достижения того же общего эффекта. Если бы у него не было этого метода, вам не повезло.
Другой действительно грязный вариант - сделать его макросом с переменным числом аргументов. Вариационный макрос выглядит так:
#define SHOW_ALERT(title,msg,del,cancel,other,...) { \
UIAlertView *_alert = [[[UIAlertView alloc] initWithTitle:title message:msg delegate:del cancelButtonTitle:cancel otherButtonTitles:other, ##__VA_ARGS__] autorelease]; \
[_alert show]; \
}
Тем не менее, даже при использовании подхода с переменным макросом вам все равно понадобится собственный макрос для каждого раза, когда вы захотите это сделать. Это не очень надежная альтернатива.