สร้าง UIActionSheet 'otherButtons' โดยส่งผ่านอาร์เรย์ไม่ใช่ varlist


110

ฉันมีอาร์เรย์ของสตริงที่ฉันต้องการใช้สำหรับชื่อปุ่มบน UIActionSheet น่าเสียดายที่อาร์กิวเมนต์ otherButtonTitles: ในการเรียกใช้เมธอดจะใช้รายการสตริงที่มีความยาวตัวแปรไม่ใช่อาร์เรย์

ฉันจะส่งต่อชื่อเหล่านี้ไปยัง UIActionSheet ได้อย่างไร วิธีแก้ปัญหาที่ฉันเห็นแนะนำคือการส่งศูนย์ไปยัง otherButtonTitles: จากนั้นระบุชื่อปุ่มทีละรายการโดยใช้ addButtonWithTitle: แต่มีปัญหาในการย้ายปุ่ม "ยกเลิก" ไปที่ตำแหน่งแรกบน UIActionSheet แทนที่จะเป็นปุ่มสุดท้าย ฉันอยากให้เป็นคนสุดท้าย

มีวิธีในการ 1) ส่งอาร์เรย์แทนรายการตัวแปรของสตริงหรืออีกวิธีหนึ่ง 2) ย้ายปุ่มยกเลิกไปที่ด้านล่างของ UIActionSheet หรือไม่

ขอบคุณ.


ไม่แน่ใจว่าจะใช้งานได้หรือไม่ แต่คุณสมบัติ CancelButtonIndex ของ UIActionSheet ไม่ใช่แบบอ่านอย่างเดียว ลองตั้งค่าและดูว่าจะเปลี่ยนลำดับของปุ่มหรือไม่?
lostInTransit

คำตอบ:


248

ฉันทำให้สิ่งนี้ใช้งานได้ (คุณเพียงแค่ต้องตกลงกับปุ่มปกติและเพิ่มหลังจาก:

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
งานนี้; ขอบคุณ. ไม่ทราบว่าสามารถตั้งค่าคุณสมบัติ CancelButtonIndex ได้ สิ่งหนึ่งที่ฉันคิดว่าเราทุกคนเห็นด้วย: API ของ Apple สำหรับเรื่องนี้แย่มาก
Greg Maletic

11
ฉันสองนี้! และ 99,99% ของเอกสารของพวกเขาก็แย่เช่นกัน มันเหมือนกับการพยายามเรียนรู้การผ่าตัดสมองจากหนังสือที่เขียนด้วยภาษาฮีบรูโบราณโดยไม่รู้ภาษานั้น
เป็ด

4
ฉันหวังว่าจะโหวตได้อีกหลาย ๆ ครั้ง แคร็กคำตอบและฉันไม่อยากจะเชื่อเลยว่าฉันไม่รู้เรื่องนี้มานานแล้ว!
mattjgalloway

1
@JimThio cancelButtonไม่ใช่สีแดง destructiveButtonเป็นสีแดง
Armin

1
น่าเศร้าที่โซลูชันนี้ได้รับความทุกข์ทรมานจากข้อบกพร่องใน UIActionSheet ที่[UIActionSheet addButtonWithTitle]ดูเหมือนจะไม่ได้ตั้งค่าอย่างถูกต้องfirstOtherButtonIndex(ซึ่งควรใช้ในตัวแทนactionSheet:clickedButtonAtIndex:แทนที่จะใช้ฮาร์ดโค้ด0 หรือสิ่งที่คล้ายกัน) การแปลงเป็นNSArrayto va_listก็ไม่ได้ฟังดูเป็นวิธีที่ดีเช่นกัน :-( API นี้น่าเกลียดมาก
Daniel Rinser

78

หมายเหตุเล็ก ๆ น้อย ๆ : [actionSheet addButtonWithTitle:] ส่งคืนดัชนีของปุ่มนั้นดังนั้นเพื่อความปลอดภัยและ "สะอาด" คุณสามารถทำได้:

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

ปุ่มยกเลิกจะเปลี่ยนเป็นสีแดงไหม
user4951

1
@JimThio ไม่มีปุ่มสีแดงที่เรียกว่า "destructiveButton" และมีคุณสมบัติตามลำดับdestructiveButtonIndexสำหรับมัน
นิค

3

รับคำตอบของจาบาและนิคและขยายความอีกเล็กน้อย ในการรวมปุ่มทำลายลงในโซลูชันนี้:

// 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

มีเวอร์ชันที่รวดเร็วสำหรับการตอบสนอง:

//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)

หากต้องการรับค่าที่เลือกให้เพิ่มผู้รับมอบสิทธิ์ใน ViewController ของคุณ:

class MyViewController: UIViewController, UIActionSheetDelegate

และใช้วิธีการ "clickedButtonAtIndex"

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

สำหรับผู้ใช้ในอนาคต ... มันใช้งานได้ ... แต่เลิกใช้แล้ว ... ใช้stackoverflow.com/a/41322537/884674
jeet.chanchawat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.