Почему метод init UIActionSheet принимает массив строк вместо NSString - PullRequest
0 голосов
/ 27 июля 2011

это действительно вопрос новичка, но он поможет мне лучше понять, как работает Objective-c. Я использовал UIActionSheet в приложении для iOS. Глядя на документацию, это соответствующий метод init:

- (id)initWithTitle:(NSString *)title delegate:(id < UIActionSheetDelegate >)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...

Где otherButtonTitles называется разделенным запятыми списком NSString. На мой взгляд, это соответствует NSArray, поэтому, пытаясь спровоцировать сбой, я попытался:

NSArray *buttons = [NSArray arrayWithObjects:@"B1",@"B2",nil];
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Actions" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:buttons];

А потом очевидно, что приложение зависало из-за кнопок NSArray. Это звучит так же, как Java Varargs, где в классе вы можете иметь что-то вроде:

public void myMethod(String... param) {...};

Официальный вызов этого метода:

myClass.myMethod("x");
myClass.myMethod("x","Y");

У меня есть много методов в моих приложениях для iOS, которые использовали NSArray:

[myClass myMethod:[NSArray arrayWithObjects:....]];

И мне было бы очень удобно избегать alloc NSArray, а скорее передавать разделенный запятыми список NSString. Как я могу это сделать ? Я имею в виду, с точки зрения myMethod, какой тип параметра принимается и как его следует учитывать? Например, как я могу перебрать через NSString ???

спасибо

Ответы [ 2 ]

1 голос
/ 27 июля 2011

В вашем примере должно работать следующее:

UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Actions" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"B1",@"B2",nil];

Это не сложнее, чем кажется.Разделенный запятыми список NSString - это не что иное, как список строк NSS, разделенных запятыми.

0 голосов
/ 27 июля 2011

Как король новичка в Objective-c, как и я, у меня возникает небольшое недоразумение. Как указал Грэм, метод действительно использовал переменные аргументы. На первый взгляд я полностью упустил это, нотация Java varargs имеет такой эквивалент в Objective-c:

public void myMethod(String... var);
-(void)myMethod:(NSString*)var,...;

Фактически, если вы посмотрите на сигнатуру метода UIActionSheet, то в части, касающейся других кнопок, будет введена точно такая же трехточечная запись:

otherButtonTitles:(NSString *)otherButtonTitles, ...

Также для работы с переменными аргументами в target-c я нашел очень полезную ссылку:

http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html

Возвращаясь к моему вопросу, я могу смело переписать все свои методы, реализовав «трехточечную нотацию», и выбросить все ненужные NSArray.

...