2011-07-27 120 views
0

这真的是一个新手问题,但它会帮助我更好地理解Objective-c的工作原理。我在iOS应用程序中使用了UIActionSheet。看着文档,这是相关的init方法:为什么UIActionSheet init方法接受一个字符串数组而不是NSString

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

凡被说成是一个逗号分隔otherButtonTitles NSString的列表。在我的心目中,这是记者到一个NSArray,所以用caushing崩溃的意图,我想:

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

然后很明显的应用程序崩溃,因为按钮的NSArray的。 这听起来是类同的Java可变参数,在一类,你可以有这样的:

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

对此方法的合法调用:

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

我有很多在我的iOS方法出了使用的NSArray的应用:

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

那将是非常方便的,我以避免NSArray中的页头,而是传递一个逗号分隔的NSString的列表。我怎样才能做到这一点 ?我的意思是,从myMethod的角度来看,接受了哪种类型的参数,应该如何考虑?例如,如何循环槽NSString?

感谢

回答

-1

作为Objective-c的新手之王,我对这里有一点误会。正如格雷厄姆指出的那样,该方法确实使用了可变参数。乍一看,我完全缺少这一点,Java的可变参数的符号有这相当于在Objective-C:

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

逸岸,如果你看一看UIActionSheet方法签名它把正好在部分关于其他三个相同点符号按钮:

otherButtonTitles:(NSString *)otherButtonTitles, ... 

也是处理与Objective-C的可变参数,我发现一个非常有用的链接:

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

回答我的问题,我可以通过实现'三点符号'来安全地重写我的所有方法,并扔掉所有不需要的NSArray。

1

鉴于你的榜样,下面应该工作:

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

这是没有比它更复杂的声音。 “逗号分隔的NSString列表”只不过是以逗号分隔的NSString列表。

+0

呃,可能是因为别的东西而崩溃了。但是,为什么UIActionSheet中的参数未标记为(NSArray *)otherButtonTitles? – Leonardo

+0

因为它不需要数组,所以它需要一个逗号分隔的NSString列表。 – 2011-07-27 13:06:35

+0

对不起,我再次读到你的答案,这不是我一审问的。我知道你的例子是有效的,事实上这是我设置它的方式。但我想了解为什么NSString的签名也可以是“逗号分隔的NSString”,而不仅仅是一个NSString。我试图在文档中找到这种证据,以及如何在自定义方法的情况下可以解析逗号分隔列表。 – Leonardo

相关问题