Tạo UIActionSheet 'otherButtons' bằng cách chuyển vào mảng, không phải varlist


110

Tôi có một mảng chuỗi mà tôi muốn sử dụng cho các tiêu đề nút trên UIActionSheet. Thật không may, đối số otherButtonTitles: trong lệnh gọi phương thức có một danh sách các chuỗi có độ dài thay đổi, không phải một mảng.

Vậy làm cách nào để chuyển các tiêu đề này vào UIActionSheet? Cách giải quyết mà tôi đã thấy đề xuất là chuyển nil vào otherButtonTitles :, sau đó chỉ định tiêu đề nút riêng lẻ bằng cách sử dụng addButtonWithTitle :. Nhưng điều này có vấn đề là di chuyển nút "Cancel" đến vị trí đầu tiên trên UIActionSheet thay vì cuối cùng; Tôi muốn nó là người cuối cùng.

Có cách nào để 1) chuyển một mảng thay cho danh sách chuỗi biến hoặc cách khác 2) di chuyển nút hủy xuống cuối UIActionSheet không?

Cảm ơn.


không chắc chắn nếu điều này sẽ hoạt động nhưng thuộc tính hủyButtonIndex của UIActionSheet không phải là chỉ đọc. Hãy thử đặt nó và xem điều đó có thay đổi thứ tự của các nút không?
lostInTransit

Câu trả lời:


248

Tôi đã làm việc này (bạn chỉ cần, có thể sử dụng một nút thông thường, và chỉ cần thêm nó vào sau:

NSArray *array = @[@"1st Button",@"2nd Button",@"3rd Button",@"4th Button"];

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Title Here"
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

    // ObjC Fast Enumeration
    for (NSString *title in array) {
        [actionSheet addButtonWithTitle:title];
    }

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

    [actionSheet showInView:self.view];

19
Những công việc này; cảm ơn. Không nhận ra rằng có thể đặt thuộc tínhcelButtonIndex. Một điều tôi nghĩ rằng tất cả chúng ta có thể đồng ý: API của Apple cho điều này thật tệ.
Greg Maletic

11
Tôi thứ hai này! Và 99,99% tài liệu của họ cũng tệ. Nó giống như cố gắng học giải phẫu não từ một cuốn sách viết bằng tiếng Do Thái cổ mà không biết ngôn ngữ đó.
Duck

4
Tôi rất ước mình có thể bỏ phiếu nhiều lần nữa. Câu trả lời rắc rối và tôi không thể tin rằng tôi đã đi lâu như vậy mà không biết về điều này!
mattjgalloway

1
@JimThio cancelButtonkhông có màu đỏ. Các destructiveButtonmàu đỏ.
Armin

1
Đáng buồn thay, giải pháp này gặp phải lỗi trong UIActionSheet [UIActionSheet addButtonWithTitle]dường như không được đặt chính xác firstOtherButtonIndex(nên được sử dụng trong ủy quyền actionSheet:clickedButtonAtIndex:thay vì mã cứng 0 hoặc những thứ tương tự). Việc khó chuyển đổi NSArraythành va_listcũng không phải là một giải pháp tuyệt vời. :-( API này là như vậy damn xấu xí.
Daniel Rinser

78

Một lưu ý nhỏ: [actionSheet addButtonWithTitle:] trả về chỉ mục của nút đó, vì vậy, để an toàn và "sạch sẽ", bạn có thể làm điều này:

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

Điều đó sẽ làm cho nút hủy chuyển sang màu đỏ?
user4951

1
@JimThio Không, nút màu đỏ được gọi là "destructiveButton", và có một tài sản tương ứng destructiveButtonIndexcho nó
Nick

3

Lấy câu trả lời của Jaba và Nick và mở rộng chúng xa hơn một chút. Để kết hợp nút hủy vào giải pháp này:

// Create action sheet
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:nil
                                                otherButtonTitles:nil];
// Action Buttons
for (NSString *actionName in actionNames){
    [actionSheet addButtonWithTitle: actionName];
}

// Destruction Button
if (destructiveName.length > 0){
    [actionSheet setDestructiveButtonIndex:[actionSheet addButtonWithTitle: destructiveName]];
}

// Cancel Button
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle:@"Cancel"]];

// Present Action Sheet
[actionSheet showInView: self.view];

1

Có phiên bản nhanh chóng cho phản hồi:

//array with button titles
private var values = ["Value 1", "Value 2", "Value 3"]

//create action sheet
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil)
//for each value in array
for value in values{
    //add a button
    actionSheet.addButtonWithTitle(value as String)
}
//display action sheet
actionSheet.showInView(self.view)

Để chọn giá trị, hãy thêm đại biểu vào ViewController của bạn:

class MyViewController: UIViewController, UIActionSheetDelegate

Và triển khai phương thức "clickButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}

Đối với người dùng trong tương lai ... Nó làm việc ... nhưng nó bị phản đối ... sử dụng stackoverflow.com/a/41322537/884674
jeet.chanchawat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.