Objective-c — передача переменных методу переменной длины

У меня есть массив с элементами, и я хочу передать их методу переменной длины. Как ты это делаешь?

То есть у меня есть это (например):

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

[[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:nil cancelButtonTitle:[array objectAtIndex:0] otherButtonTitles:[array objectAtIndex:1], [array objectAtIndex:2], nil];

Но представьте, что массив может иметь переменную длину элементов, поэтому вы не можете жестко запрограммировать его таким образом.


person quano    schedule 11.03.2010    source источник
comment
Почему бы вам просто не передать массив? Затем метод будет перебирать массив и выяснять, что с ним делать.   -  person peterp    schedule 11.03.2010
comment
UIAlertView этого не делает.   -  person quano    schedule 11.03.2010


Ответы (2)


В документации для параметра otherButtonTitles в -[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:] указано, что:

Использование этого аргумента эквивалентно вызову addButtonWithTitle: с этим заголовком для добавления дополнительных кнопок.

Вы пробовали это:

NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil];
for (NSString *s in array) {
    [view addButtonWithTitle:s];
}
person mipadi    schedule 11.03.2010
comment
Как есть, это дважды добавляет 0-й объект массива, но это легко исправить. - person ; 11.03.2010

- (id) initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles ...
{
    va_list args;
    va_start(args, otherButtonTitles);
    for (NSString *arg = otherButtonTitles; arg != nil; arg = va_arg(args, NSString*))
    {
        //do something with nsstring
    }
    va_end(args);
}

Вы также можете просто указать аргумент в своих функциях, который принимает массив (простое решение)

В любом случае обозначение ... предназначено для переменного количества аргументов в конце функции.

person Luuk van Rens    schedule 11.03.2010
comment
Отсутствие запятой в конце списка аргументов, должно быть - (id) initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... - person Steph Sharp; 30.05.2013