54

UIAlertSheet 的构造函数将 otherButtonTitles 参数作为 varg 列表。我想从 NSArray 指定其他按钮标题。这可能吗?

即我必须这样做:

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

但由于我在运行时生成可用按钮列表,所以我真的想要这样的东西:

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

现在,我在想我需要单独调用initWithTitle:1 个项目、2 个项目和 3 个项目。像这样:

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
}

这是很多重复的代码,但实际上可能是合理的,因为我最多有三个按钮。我怎样才能避免这种情况?

4

6 回答 6

72

这是一岁了,但解决方案非常简单......按照@Simon的建议做,但不要指定取消按钮标题,所以:

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

但是在添加普通按钮后,添加取消按钮,例如:

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

[alert addButtonWithTitle:cancelString];

现在关键步骤是指定哪个按钮是取消按钮,例如:

alert.cancelButtonIndex = [titles count];

我们这样做[titles count]而不是[titles count] - 1因为我们将取消按钮作为额外的按钮从titles.

您现在还可以通过指定破坏性按钮索引(通常是按钮)来指定您希望哪个按钮成为破坏性按钮(即红色按钮[titles count] - 1)。此外,如果您将取消按钮保留为最后一个按钮,iOS 将在其他按钮和取消按钮之间添加很好的间距。

所有这些都兼容 iOS 2.0,所以尽情享受吧。

于 2012-11-28T22:05:37.660 回答
52

不要在初始化 UIActionSheet 时添加按钮,而是尝试使用通过 NSArray 的 for 循环使用 addButtonWithTitle 方法添加它们。

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

for( NSString *title in titles)  
    [alert addButtonWithTitle:title]; 
于 2009-10-21T17:23:29.530 回答
6

addButtonWithTitle:返回添加按钮的索引。在 init 方法中将 cancelButtonTitle 设置为 nil 并在添加其他按钮后运行:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
于 2013-08-24T05:21:15.497 回答
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];
}
于 2012-12-25T07:28:36.310 回答
2

您可以添加取消按钮并将其设置如下:

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
于 2014-02-18T17:06:09.850 回答
1

我知道这是一个旧帖子,但以防其他人,比如我,试图解决这个问题。

(这由@kokemomuke 回答。这主要是一个更详细的解释。同样建立在@Ephraim 和@Simon 之上)

事实证明 addButtonWithTitle 的最后一个条目:需要是Cancel按钮。我会使用:

// 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;
于 2014-06-17T07:05:36.010 回答