2011-12-30 47 views
5

有許多方法在要求的字符串列表的SDK,以一比零結束,例如,在UIActionSheet:構建NIL結尾的NSString列表作爲一個NSString *

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

「otherButtonTitles」在這種情況下是以零結尾的NSStrings列表。我想要做的就是調用帶有NSStrings的構造NSMutableArray的這個方法,因爲我想動態地創建和排序參數。我將如何做到這一點?在這種情況下,我不確定如何創建一個NSS終止的指向NSStrings的指針,如果傳遞它,甚至可以工作。我是否必須手動爲其分配內存並釋放它?

回答

9

不能將任何數組轉換成可變參數列表。

然而,對於UIActionSheet,您可以添加這些otherButtonTitles在創建表後,用-addButtonWithTitle:

UIActionSheet* sheet = [[UIActionSheet alloc] initWithTitle:... 
                 /*etc*/ 
              otherButtonTitles:nil]; 
for (NSString* otherButtonTitle in otherButtonTitlesArray) 
{ 
    [sheet addButtonWithTitle:otherButtonTitle]; 
} 
+4

這不,如果你設置取消您的UIActionSheet按鈕一個很好的解決方案。當你初始化工作表,然後用上面的循環添加'otherButtons'時,由於某種原因,你的取消按鈕將最終放在它們之上。 – Arnold 2012-10-05 01:51:49

+0

應該解決問題。 [sheet setCancelButtonIndex:[sheet numberOfButtons] - 1]; – mtwagner 2012-11-14 15:57:52

+0

@mtwagner nope這隻會改變按鈕的樣式 - 不是它們出現的順序 – 2013-08-24 13:19:27

5

我需要做一個動態動作片爲好。所以我做了一個大部分都是空的動作表。添加了我的按鈕。然後添加取消按鈕並將其標記爲取消。

sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:homeName, nil];  
[sheet addButtonWithTitle:otherButton1]; 
[sheet addButtonWithTitle:otherButton2]; 
[sheet addButtonWithTitle:@"Cancel"]; 
[sheet setCancelButtonIndex:[sheet numberOfButtons] - 1]; 
sheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent; 
[sheet showInView:self.view]; 
[sheet release]; 
+0

這比接受的答案更完整的答案。謝謝! – 2014-03-13 17:46:54

1

你肯定CAN轉換的NSArray到va_list的。例如與NSString

- (id)initWithFormat:(NSString *)format arguments:(va_list)argList 

篩選使用:

+ (id)stringWithFormat:(NSString *)format array:(NSArray *)arguments; 
{ 
    NSRange range = NSMakeRange(0, [arguments count]); 
    NSMutableData *data = [NSMutableData dataWithLength:sizeof(id) * [arguments count]]; 
    [arguments getObjects:(__unsafe_unretained id *) data.mutableBytes range:range]; 
    return [[NSString alloc] initWithFormat:format arguments:data.mutableBytes]; 
} 
+0

說你可以做到這一點很好,指向一個不同的用例;但是你可以爲OP提供的用例做這件事嗎? – Ryan 2013-11-06 09:04:16

+0

這是接受答案的第一行的評論,所以您的評論是沒有必要的 – LorikMalorik 2013-11-09 07:47:52