2011-12-30 31 views
5

örneğin UIActionSheet bir nil tarafından sonlandırılmış dizeler listesi için sormak SDK'deki birçok yöntemler vardır:gibi bir nil-sonlandırılmış NSString listesini Oluşturma bir NSString *

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

'otherButtonTitles' Bu durumda bir nil ile sonlandırılmış NSStrings bir listesidir. Yapmak istediklerim, NSStrings'in yapılandırılmış bir NSMutableArray'ı ile bu yöntemi çağırmaktır çünkü argümanları dinamik olarak oluşturmak ve sıralamak isterim. Bunu nasıl yapardım? Bu durumda NSStrings'e bir nil sonlandırmalı işaretçi nasıl oluşturulacağından emin değilim ve bunu iletmek bile işe yarayacak. Belleği bunun için tahsis etmeli ve serbest bırakmalı mıyım?

cevap

9

Siz herhangi bir diziyi değişken bir listeye dönüştüremezsiniz. sac oluşturulduktan sonra ancak

, UIActionSheet için, sen ben de dinamik bir eylem levha yapmak gerekir -addButtonWithTitle:

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

Bu, bir senin UIActionSheet iptal düğmesine ayarlarken eğer iyi bir çözüm değildir. Sayfayı ilklendirdiğinizde ve yukarıdaki gibi bir döngü ile "otherButtons" ifadesini eklediğinizde, İptal düğmeniz bir sebepten öte üst üste oturmaya başlar. – Arnold

+0

Sorunu çözmeliyiz. [sheet setCancelButtonIndex: [sheet numberOfButtons] - 1]; – mtwagner

+0

@mtwagner nope yalnızca düğmenin stilini değiştirir - göründükleri sıraya göre değil –

5

kullanılmak suretiyle bu otherButtonTitles ekleyebilir. Bu yüzden çoğunlukla boş bir eylem planı yaptım. Düğmelerimi ekledim. Sonra İptal düğmesini eklediniz ve iptal olarak işaretlediniz.

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

Bu kabul edilenden daha eksiksiz bir cevap. Teşekkürler! –

1

emin va_list için NSArray dönüştürmek CAN. örnekte, bu gibi NSString

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

ile kullanmak için:

+ (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

, bunu farklı bir kullanım örneğine işaret ederek yapabileceğinizi söylemek güzel; ama OP tarafından verilen kullanım durumu için YAPABİLİRSİNİZ? – Ryan

+0

Kabul edilen bir cevabın ilk satırı için yorumdur, bu yüzden yorumunuz gerekli değildir – LorikMalorik