2011-10-15 29 views
7

Tôi có một trang tính có các tùy chọn khác nhau tùy theo hoàn cảnh. Có đủ tiêu đề nút khác nhau mà tôi muốn xây dựng một mảng của những tiêu đề nút đầu tiên, nhưng tôi không thể tìm ra cách để chuyển đổi đó thành định dạng varargs.Làm thế nào tôi có thể gửi một chuỗi các chuỗi vào một phương thức init varia của UIActionSheet?

tôi muốn làm một cái gì đó như thế này:

NSMutableArray *buttonTitles = [NSMutableArray array]; 
if (condition1) { 
    [buttonTitles addObject: @"Do action 1"]; 
} 
if (condition2) { 
    [buttonTitles addObject: @"Do action 2"]; 
} 
if (condition3) { 
    [buttonTitles addObject: @"Do action 3"]; 
} 
if (condition4) { 
    [buttonTitles addObject: @"Do action 4"]; 
} 
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: buttonTitles] autorelease]; 

Bây giờ rõ ràng là nếu tôi đã phải tôi có thể làm một cái gì đó giống như thay vì điều này:

UIActionSheet *actionSheet = nil; 
if (condition1 && condition2 && condition3 && condition4) { 
    actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", @"Do action 4", nil] autorelease];  
} else if (condition1 && condition2 && condition3 && !condition4) { 
    actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", nil] autorelease];  
} 
// else ... 
// about 14 other cases! 

Nhưng đó sẽ là khủng khiếp. Bất cứ ai biết một số cú pháp cú pháp tốt đẹp để giúp tôi ra?

EDIT: Nó đã được gợi ý rằng tôi sử dụng addButtonWithTitle, mà trên mặt của nó sẽ rất tốt, tiếc là nó này đặt các nút bổ sung sau khi nút hủy, mà không phải là mong muốn.

Tôi tin rằng đây là lỗi với mã của Apple kể từ khi tài liệu của họ trên addButtonWithTitle trạng thái:

// adds a button with the title. returns the index (0 based) of where it was added. buttons are displayed in the order added except for the 
// destructive and cancel button which will be positioned based on HI requirements. buttons cannot be customized. 

yêu cầu HI (hướng dẫn Human Interface riêng của Apple) ủng hộ vào nút hủy dưới tất cả các tùy chọn khác, vì vậy tôi muốn nói của Apple hơi say lên. Tất nhiên, điều đó không thực sự giúp tôi, vì vậy tôi trở lại để cố gắng chuyển đổi giữa một NSArray và một varargs, mà tôi vẫn không biết làm thế nào để làm.

Trả lời

18

Bạn có thể thử

NSMutableArray *buttonTitles = [NSMutableArray array]; 
if (condition1) { 
    [buttonTitles addObject: @"Do action 1"]; 
} 
if (condition2) { 
    [buttonTitles addObject: @"Do action 2"]; 
} 
if (condition3) { 
    [buttonTitles addObject: @"Do action 3"]; 
} 
if (condition4) { 
    [buttonTitles addObject: @"Do action 4"]; 
} 
[buttonTitles addObject: @"Cancel"]; 
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil] autorelease]; 

for (NSString *title in buttonTitles) { 
    [actionSheet addButtonWithTitle: title]; 
} 

[actionSheet setCancelButtonIndex: [buttonTitles count] - 1]; 
+0

Tôi nghĩ rằng điều này đã hiệu quả, nhưng tôi đã tìm thấy một số vấn đề với nó, hãy xem chỉnh sửa. –

+0

Vui lòng kiểm tra chỉnh sửa. –

+0

Điều này đã hiệu quả. Có vẻ như không có bất kỳ nhu cầu để gây rối với bất kỳ tiêu đề phụ mặc dù. –

4

Tại sao không chỉ làm điều gì đó này như thế này:

for (Nstring *button in buttonTitles) 
    [actionSheet addButtonWithTitle:button]; 
+0

Tôi nghĩ rằng điều này làm việc, nhưng tôi tìm thấy một số vấn đề với nó, xem chỉnh sửa. –

5

Một biến thể của Himanshu của câu trả lời:

UIActionSheet * as = [[UIActionSheet alloc] initWithTitle:@"Share" 
               delegate:self 
             cancelButtonTitle:nil /* don't set Cancel title here! */ 
            destructiveButtonTitle:nil 
             otherButtonTitles:nil]; 
int cancelButtonIndex = 0; // will remain 0 if no other buttons besides "Cancel" 
if (canShareBySMS) 
{ 
    [as addButtonWithTitle:kSMSButtonText]; 
    cancelButtonIndex++; 
} 
if (canShareByMail) 
{ 
    [as addButtonWithTitle:kEmailButtonText]; 
    cancelButtonIndex++; 
} 
/* etc. */ 

// after all other buttons have been added, include Cancel 
[as addButtonWithTitle:@"Cancel"]; 
[as setCancelButtonIndex:cancelButtonIndex]; 

[as showInView:self.sharingViewController.view]; 
[as release]; 

Lưu ý: Phương pháp UIActionSheetDelegate bạn nên kiểm tra chống lại tiêu đề nút thay vì buttonIndex:

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:kSMSButtonText]) { 
    //share via sms 
    }else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:kEmailButtonText]) { 
    //share via mail 
    } 
} 

Tôi nghĩ rằng chi tiết chính mà mọi người bỏ lỡ là đặt nút hủy trong bộ chọn initWithTitle, thay vì thêm nó sau tất cả các nút khác và chỉ định giao diện nút hủy bằng cách gọi setCancelButtonIndex :.

0

Đây là phương pháp tôi đã thử có vẻ hoạt động tốt. Tính năng này hoạt động nếu bạn muốn thêm nút bổ sung ở cuối các nút, trước nút "hủy".

NSString * optionalButton = nil; 
if (condition4) { 
    optionalButton = @"Some Additional Option"; 
} 

UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"Some Title" 
                  delegate:self 
               cancelButtonTitle:@"Cancel" 
              destructiveButtonTitle:nil 
               otherButtonTitles:@"Button 1",@"Button 2",@"Button 3",optionalButton, nil]; 


[actionSheet showInView:self.view]; 

Nó dường như là ổn cộng thêm 'nil' ở cuối danh sách các nút nếu tình trạng của bạn (condition4) không được đáp ứng.

Tôi đã thử nghiệm thành công tính năng này trên iOS7.

Các vấn đề liên quan