http://stackoverflow.com/questions/1602214/use-nsarray-to-specify-otherbuttontitles

UIAlertSheet's constructor takes an otherButtonTitles parameter as a varg list. I'd like to specify the other button titles from an NSArray instead. Is this possible?

i.e. I have to do this:

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

But since I'm generating the list of available buttons at runtime, I really want something like this:

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

Right now, I'm thinking that I need to have a seperate call to initWithTitle: for 1 item, 2 items and 3 items. Like this:

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
}

That's a lot of duplicate code, but it might actually be reasonable since I have at most three buttons. How can I avoid this?

asked Oct 21 '09 at 17:10
Steven Fisher
24.8k1489139
 

6 Answers

This is a year old but the solution is pretty simple ... do as @Simon suggested but do not specify a cancel button title, so:

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

But after adding your normal buttons, add the cancel button, like:

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

Now the key step is to specify which button is the cancel button, like:

sheet.cancelButtonIndex = [titles count];

We do [titles count] and not [titles count] - 1 because we are adding the cancel button as extra from the list of buttons in titles.

You now also specify which button you want to be the destructive button (ie the red button) by specifying the destructiveButtonIndex (typically that will be the [titles count] - 1 button). Also, if you keep the cancel button to be the last button, iOS will add that nice spacing between the other buttons and the cancel button.

All of these is iOS 2.0 compatible so enjoy.

answered Nov 28 '12 at 22:05
Ephraim
1,91111315
 
    
Not sure why it worked for you, but I had to do "[titles count] - 1" for it to work for me, iOS 7. –  Micah Mar 28 '14 at 18:38
    
[alert numberOfButtons]-1 is another way to set the cancel button's index –  Keith Apr 3 '14 at 16:42 
    
Minor note: Using the names you've established here, I think sheet.cancelButtonIndex should bealert.cancelButtonIndex, yes? –  Matt May 15 '14 at 23:59
 

Instead of adding the buttons when you initialize the UIActionSheet, try adding them with the addButtonWithTitle method using a for loop that goes through your NSArray.

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: nil]; for( NSString *title in titles)
[alert addButtonWithTitle:title];
answered Oct 21 '09 at 17:23
Simon
1,1761916
 
12  
easier than that: for (NSString * title in titles) { [alert addButtonWithTitle:title]; }There's no need to create an enumerator. –  Dave DeLong Oct 21 '09 at 17:28
3  
This makes the buttons appear AFTER the cancel button. Any way to fix this @bent or @simon? (see edit on stackoverflow.com/questions/7781022) –  Micah Hainline Oct 17 '11 at 23:38
1  
Try using the cancelButtonIndex property. –  Simon Nov 23 '11 at 20:53
1  
@MicahHainline - just add this line at the end of the 'for' loop: [actionSheet addButtonWithTitle:@"Cancel_Button_Title"]; actionSheet.cancelButtonIndex = actionSheet.numberOfButtons-1; –  Sagiftw Mar 18 '12 at 18:26 
    
This adds the buttons under the cancel button for me. –  jspooner Apr 12 '12 at 2:12

addButtonWithTitle: returns the index of the added button. Set cancelButtonTitle to nil in the init method and after adding additional buttons run this:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
answered Aug 24 '13 at 5:21
 
- (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];
}
answered Dec 25 '12 at 7:28
 

You can add the cancel button and set it like this:

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
answered Feb 18 '14 at 17:06
 

I know this is an old post, but in case someone else, like me, is trying to figure this out.

(This WAS answered by @kokemomuke. This is mostly a more detailed explanation. Also building on @Ephraim and @Simon)

It turns out the LAST entry of addButtonWithTitle: needs to be the Cancel button. I'd use:

// 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;
answered Jun 17 '14 at 7:05
 

Use NSArray to specify otherButtonTitles?的更多相关文章

  1. iOS UIAlertController跟AlertView用法一样 && otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 写法

    今天写弹出框UIAlertController,用alertView习惯了,所以封装了一下,跟alertView用法一样,不说了,直接上代码: 先来了解一下otherButtonTitles:(nul ...

  2. 不可变数组NSArray

    //数组里面不允许存放基本数据类型,只能存放“对象” NSArray *array = [NSArray arrayWithObjects:@"周星星",@"尹天仇&qu ...

  3. iOS NSArray数组过滤

    需求:在一个数组里面,将在这个数组中的并且在另一个数组里面的元素过滤掉. 即:在一个数组dataArray里面,将在dataArray数组中的并且在filteredArray数组里面的元素过滤掉. / ...

  4. NSArray 倒序 输出

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3" ...

  5. Fouandation(NSString ,NSArray,NSDictionary,NSSet) 中常见的理解错误区

    Fouandation 中常见的理解错误区 1.NSString //快速创建(实例和类方法) 存放的地址是 常量区 NSString * string1 = [NSString alloc]init ...

  6. 一段可以清理NSArray中的空对象的代码(递归)

    - (NSArray *)clearAllNullObject{ NSMutableArray *array = [self mutableCopy]; ;i < array.count;i++ ...

  7. 一些NSArray,NSDictionary,NSSet相关的算法知识

    iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过.只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准 ...

  8. NSArray

    版权声明:本文为博主原创文章,未经博主允许不得转载. 数组是一个元素有序.元素可重复的集合,在iOS编程中经常被用到,而Foundation框架提供了数组对象.数组对象包括不可修改的数组对象NSArr ...

  9. 如何删除NSDictionary或NSArray中的NSNull

    前段时间与某公司的技术交流,被问到一个问题,如何删除NSDictionary中的NSNull.当时在纸上写,以前太依赖Xcode编译器了,以至于方法名都写不全,最终也没写出来,我想我肯定被鄙视的体无完 ...

随机推荐

  1. shell+vim——05

    ln --->link 链接, 链接有两种: 软连接 ln -s 源文件 目标文件   :相当于创建了一个快捷方式,源文件损坏后这个链接也就失效了 ln -s  a.text  a.text.s ...

  2. Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)

    传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...

  3. 笔记-python-lib-contextlib

    笔记-python-lib-contextlib 1.      contextlib with 语句很好用,但不想每次都写__enter_-和__exit__方法: py标准库也为此提供了工具模块c ...

  4. Visual Studio Emulator for Android 折腾记

    想用虚拟机调试Android项目,于是想到了MS免费提供的 Visual Studio Emulator for Android,这玩意价格免费量又足,N久之前试用过,速度杠杠的! 安装包很小,不到4 ...

  5. linux下多线程断点下载工具-axel

    今天要下载一下14G左右的文件,用wget约10小时,后来发现linux下有个多线程支持断点续传的下载工具axel,试了一下,下载速度大大增加. 包地址:http://pkgs.repoforge.o ...

  6. (原)Unreal渲染相关的缓冲区 及其 自定义代码几种抓取

    @authot: 白袍小道   转载说明那啥即可. (图片和本文无关,嘿嘿,坑一下)         以下为Unreal4.18版本中对GPUBuffer部分的分析结果 (插入:比之够着,知至目的) ...

  7. [C++] 数据结构应用——链表

    C++ 数据结构应用--链表 代码已经封装成class啦,方便使用. 头文件:Linklist.h #include <iostream> /*********************** ...

  8. 先立一个书单【flag】,敦促自己温故知新

    书单来源david mimno副教授给ML新生的建议博文,外加一部分搜罗的书籍 学习方式:以书籍查看,习题为辅,代码为最终实现方式,分主题进行今年的学习笔记,立此旗为证. 线代 --> 概率统计 ...

  9. 关于 vee-validate直接引用的方法

    转载于:https://blog.csdn.net/hy111/article/details/79046500?%3E 由于当前项目使用的是基于jQuery的前端结构,尝试在新增需求中使用VUE2, ...

  10. nodejs取参四种方法req.body,req.params,req.param,req.body

    摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现. 获取 ...