通过传入数组而非varlist创建UIActionSheet'otherButtons'


110

我有一个字符串数组,我想用于UIActionSheet上的按钮标题。不幸的是,方法调用中的otherButtonTitles:参数采用可变长度的字符串列表,而不是数组。

那么如何将这些标题传递给UIActionSheet?我见过建议的解决方法是将nil传递给otherButtonTitles :,然后使用addButtonWithTitle:分别指定按钮标题。但这存在将“取消”按钮移动到UIActionSheet上的第一个位置而不是最后一个位置的问题。我希望它成为最后一个。

有没有办法1)传递数组来代替可变的字符串列表,或者2)将取消按钮移到UIActionSheet的底部?

谢谢。


不知道这是否可以工作,但是UIActionSheet的cancelButtonIndex属性不是只读的。尝试设置它,看看是否会改变按钮的顺序?
lostInTransit 2010年

Answers:


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属性。我想我们都可以达成共识的一件事是:Apple的API很糟糕。
格雷格·马列蒂奇

11
我第二!而且他们99.99%的文档也很烂。这就像试图从一本用古希伯来语写的书中学习脑外科手术而又不懂该语言一样。
鸭子

4
我非常希望我能多次投票赞成。开裂的答案,我不敢相信我已经走了这么久,对此一无所知!
mattjgalloway 2012年

1
@JimThio cancelButton不是红色的。该destructiveButton是红色的。
阿明2013年

1
令人遗憾的是,此解决方案存在UIActionSheet中的一个错误,该错误[UIActionSheet addButtonWithTitle]似乎未正确设置firstOtherButtonIndex(应在委托的actionSheet:clickedButtonAtIndex:而不是硬编码0或类似的东西中使用)。越来越讨厌与转换的NSArray,以va_list不听起来像一个伟大的解决办法。:-(这个API是该死的丑陋。
丹尼尔洗瓶

78

一点点注意:[actionSheet addButtonWithTitle:]返回该按钮的索引,因此为了安全起见,您可以执行以下操作:

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

那会使取消按钮变成红色吗?
user4951 2013年

1
@JimThio没有,红色按钮被称为“destructiveButton”,并有一个相应的属性destructiveButtonIndex
尼克

3

采纳Jaba和Nick的答案,并将其进一步扩展。要将销毁按钮合并到此解决方案中:

// 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 18-10-24
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.