使用NSArray来指定otherButtonTitles?

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

即我必须这样做:

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

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

 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 } 

这是很多重复的代码,但它可能是合理的,因为我最多只有三个button。 我怎样才能避免这一点?

这是一个旧的,但解决scheme是非常简单的…做@Simonbuild议,但不要指定取消button的标题,所以:

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

但是在添加正常button后,添加取消button,如:

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

现在关键的一步是指定哪个button是取消button,如:

 alert.cancelButtonIndex = [titles count]; 

我们做[titles count]而不是[titles count] - 1因为我们在titles中的button列表中增加了取消button。

你现在还可以通过指定破坏性的button索引(通常是[titles count] - 1button)指定你想要哪个button成为破坏性button(即红色button)。 另外,如果你保持取消button是最后一个button,iOS会在其他button和取消button之间添加一个很好的间距。

所有这些都是与iOS 2.0兼容的,所以很享受。

在初始化UIActionSheet时,不要添加button,而应使用通过NSArray的for循环,使用addButtonWithTitle方法添加button。

 UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString delegate: self cancelButtonTitle: cancelString destructiveButtonTitle: nil otherButtonTitles: nil]; for( NSString *title in titles) [alert addButtonWithTitle:title]; 

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

 actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"]; 
 - (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]; } 

您可以添加取消button,并像这样设置:

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

我知道这是一个旧的post,但如果像我这样的其他人正试图弄清楚这一点。

(这个是由@kokemomuke回答的,这个主要是一个更详细的解释,也是build立在@Ephraim和@Simon上)

原来addButtonWithTitle的最后一项:需要是Cancelbutton。 我会使用:

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