2011-07-27 45 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

相關問題