Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么UIActionSheet init方法接受字符串数组而不是NSString_Objective C_Nsstring_Nsarray - Fatal编程技术网

Objective c 为什么UIActionSheet init方法接受字符串数组而不是NSString

Objective c 为什么UIActionSheet init方法接受字符串数组而不是NSString,objective-c,nsstring,nsarray,Objective C,Nsstring,Nsarray,这确实是一个新手问题,但它将帮助我更好地理解Objective-c的工作原理。我在iOS应用程序中使用了UIActionSheet。查看文档,这是相关的初始化方法: - (id)initWithTitle:(NSString *)title delegate:(id < UIActionSheetDelegate >)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSS

这确实是一个新手问题,但它将帮助我更好地理解Objective-c的工作原理。我在iOS应用程序中使用了UIActionSheet。查看文档,这是相关的初始化方法:

- (id)initWithTitle:(NSString *)title delegate:(id < UIActionSheetDelegate >)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
然后很明显,应用程序因为按钮不安全而崩溃。 这听起来与Java varargs非常相似,在Java varargs中,类中可以有如下内容:

public void myMethod(String... param) {...};
对此方法的合法调用是:

myClass.myMethod("x");
myClass.myMethod("x","Y");
在我的iOS应用程序中,我有很多使用NSArray的方法:

[myClass myMethod:[NSArray arrayWithObjects:....]];
对我来说,避免NSArray的alloc,而是传递一个逗号分隔的NSString列表会非常方便。我该怎么做?我的意思是,从myMethod的角度来看,收到的参数是什么类型的,应该如何考虑?例如,如何通过NSString循环


谢谢

举个例子,下面应该可以:

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

这并不比听起来复杂。“逗号分隔的NSString列表”只不过是一个NSString列表,用逗号分隔。

作为Objective-c新手之王,我有点误解了。正如格雷厄姆所指出的,该方法确实使用了变量参数。乍一看,我完全忽略了这一点,Java varargs符号在Objective-c中有这样的等价物:

public void myMethod(String... var);
-(void)myMethod:(NSString*)var,...;
事实上,如果您查看UIActionSheet方法签名,它会在关于其他按钮的部分中使用完全相同的三点符号:

otherButtonTitles:(NSString *)otherButtonTitles, ...
在处理objective-c中的变量参数时,我还发现了一个非常有用的链接:


说到我的问题,我可以通过实现“三点符号”安全地重写我的所有方法,并扔掉所有不必要的NSArray。

uhm,可能是因为其他原因而崩溃。但是,为什么UIActionSheet中的参数没有标记为(NSArray*)OtherButtonTiles?因为它不采用数组,所以它采用以逗号分隔的NSString列表。对不起,我再次阅读了您的答案,这不是我一开始问的问题。我知道你的例子是有效的,事实上这就是我建立它的方式。但我想理解为什么NSString的签名也可以是“逗号分隔的NSString”,而不仅仅是NSString。我正试图在文档中找到这方面的证据,以及在使用自定义方法的情况下如何解析逗号分隔列表。特别是,只要稍加注意,这在动态创建按钮的情况下可能非常有用。例如,如何编写NSString*dynamicButtons=[@“x”,“x2”,nil];还有otherButtonsTitles=dynamicButtons?这个最新的评论有一个坏的例子,用AddButtonWithTitle可以很容易地解决这个问题,但我希望我把这个概念讲清楚了。
otherButtonTitles:(NSString *)otherButtonTitles, ...