2009-10-21 25 views
54

Hàm tạo của UIAlertSheet nhận tham sốButtonTitles khác dưới dạng danh sách varg. Tôi muốn chỉ định các tiêu đề nút khác từ NSArray thay thế. Điều này có thể không?Sử dụng NSArray để chỉ định các phụ đề khác?

tức là tôi phải làm điều này:

id alert = [[UIActionSheet alloc] initWithTitle: titleString 
            delegate: self 
            cancelButtonTitle: cancelString 
            destructiveButtonTitle: nil 
            otherButtonTitles: button1Title, button2Title, nil]; 

Nhưng vì tôi là tạo ra danh sách các nút có sẵn tại thời gian chạy, tôi thực sự muốn một cái gì đó như thế này:

id alert = [[UIActionSheet alloc] initWithTitle: titleString 
             delegate: self 
           cancelButtonTitle: cancelString 
         destructiveButtonTitle: nil 
           otherButtonTitles: otherButtonTitles]; 

Ngay bây giờ, tôi tôi nghĩ rằng tôi cần phải có một cuộc gọi riêng biệt để initWithTitle: cho 1 mục, 2 mục và 3 mục. Như thế này:

if ([titles count] == 1) { 
    alert = [[UIActionSheet alloc] initWithTitle: titleString 
             delegate: self 
           cancelButtonTitle: cancelString 
          destructiveButtonTitle: nil 
           otherButtonTitles: [titles objectAtIndex: 0], nil]; 
} else if ([titles count] == 2) { 
    alert = [[UIActionSheet alloc] initWithTitle: titleString 
             delegate: self 
           cancelButtonTitle: cancelString 
          destructiveButtonTitle: nil 
           otherButtonTitles: [titles objectAtIndex: 0], [titles objectAtIndex: 1], nil]; 
} else { 
    // and so on 
} 

Đó là nhiều mã trùng lặp, nhưng nó thực sự có thể hợp lý vì tôi có tối đa ba nút. Làm thế nào tôi có thể tránh điều này?

Trả lời

72

Đây là một năm cũ nhưng giải pháp là khá đơn giản ... làm như @Simon gợi ý nhưng không chỉ định một tiêu đề hủy bỏ nút, vì vậy:

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString 
           delegate: self 
           cancelButtonTitle: nil 
           destructiveButtonTitle: nil 
           otherButtonTitles: nil]; 

Nhưng sau khi thêm các nút bình thường của bạn , thêm nút hủy, như:

for(NSString *title in titles) { 
    [alert addButtonWithTitle:title]; 
} 

[alert addButtonWithTitle:cancelString]; 

Bây giờ bước quan trọng là phải xác định nút đó là nút hủy, như:

alert.cancelButtonIndex = [titles count]; 

Chúng tôi làm [titles count] và không [titles count] - 1 vì chúng tôi đang thêm nút hủy thêm từ danh sách các nút trong titles.

Bây giờ bạn cũng chỉ định nút nào bạn muốn là nút phá hoại (tức là nút màu đỏ) bằng cách chỉ định destructiveButtonIndex (thường sẽ là nút [titles count] - 1). Ngoài ra, nếu bạn giữ nút hủy là nút cuối cùng, iOS sẽ thêm khoảng cách đẹp giữa các nút khác và nút hủy.

Tất cả những thứ này đều tương thích với iOS 2.0 nên bạn hãy tận hưởng.

+0

Không chắc chắn lý do tại sao nó hoạt động cho bạn, nhưng tôi phải làm "[title count] - 1" để nó hoạt động cho tôi, iOS 7. – Micah

+1

[alert numberOfButtons] -1 là một cách khác để thiết lập chỉ mục của nút hủy – Keith

+2

Nhỏ lưu ý: Sử dụng các tên bạn đã thiết lập ở đây, tôi nghĩ 'sheet.cancelButtonIndex' nên là' alert.cancelButtonIndex', phải không? – Matt

52

Thay vì thêm các nút khi bạn khởi tạo UIActionSheet, hãy thử thêm chúng bằng phương thức addButtonWithTitle sử dụng vòng lặp for đi qua NSArray của bạn.

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString 
           delegate: self 
           cancelButtonTitle: cancelString 
           destructiveButtonTitle: nil 
           otherButtonTitles: nil]; 

for(NSString *title in titles) 
    [alert addButtonWithTitle:title]; 
+12

dễ hơn thế: 'cho (tiêu đề NSString * trong tiêu đề) {[alert addButtonWithTitle: title]; } 'Không cần tạo một điều tra viên. –

+3

Điều này làm cho các nút xuất hiện SAU KHI nút hủy. Bất kỳ cách nào để sửa lỗi này @bent hoặc @simon? (xem chỉnh sửa trên http://stackoverflow.com/questions/7781022) –

+1

Thử sử dụng thuộc tính 'cancelButtonIndex'. – Simon

4
- (void)showActionSheetWithButtons:(NSArray *)buttons withTitle:(NSString *)title { 

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: title 
                  delegate: self 
                cancelButtonTitle: nil 
               destructiveButtonTitle: nil 
                otherButtonTitles: nil]; 

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

    [actionSheet addButtonWithTitle: @"Cancel"]; 
    [actionSheet setCancelButtonIndex: [buttons count]]; 
    [actionSheet showInView:self.view]; 
} 
6

addButtonWithTitle: trả về chỉ mục của nút được thêm. Đặt cancelButtonTitle để nil trong phương thức init và sau khi thêm nút thêm chạy này:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"]; 
2

Bạn có thể thêm nút hủy và thiết lập nó như thế này:

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]]; 
1

Tôi biết đây là một bài cũ, nhưng trong trường hợp một người khác, như tôi, đang cố gắng tìm ra điều này.

(Thư này được trả lời bởi @kokemomuke. Đây gần như là giải thích chi tiết hơn.Cũng xây dựng trên @Ephraim và @Simon)

Nó chỉ ra các LAST nhập cảnh của addButtonWithTitle: cần phải được nút Cancel. Tôi muốn sử dụng:

// All titles EXCLUDING Cancel button 
for(NSString *title in titles) 
    [sheet addButtonWithTitle:title]; 


// The next two line MUST be set correctly: 
// 1. Cancel button must be added as the last entry 
// 2. Index of the Cancel button must be set to the last entry 

[sheet addButtonWithTitle:@"Cancel"]; 

sheet.cancelButtonIndex = titles.count - 1; 
Các vấn đề liên quan