使用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] - 1
button)指定你想要哪个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的最后一项:需要是Cancel
button。 我会使用:
// 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;
- 如何在Xcode项目中更改产品名称?
- 无法获得UIView sizeToFit做任何有意义的事情
- 艾沃房地产,通过自己访问?
- UIViewContentModeScaleAspectFit和UIViewContentModeScaleToFill之间的区别?
- 如何获得iPhone上的WIFI网关地址?
- iOS推送通知 – 当您点击应用程序图标而不是通知时如何获取通知数据
- 如何禁用iOS 6中的导航栏阴影与自定义背景图像的导航栏?
- UIScrollView:水平分页,垂直滚动?
- 什么时候应该使用UIImagePickerControllerSourceTypePhotoLibrary而不是UIImagePickerControllerSourceTypeSavedPhotosAlbum?