如何将字符串数组发送到 UIActionSheet varargs init 方法中?
我有一份行动表,其中的选项根据具体情况而有所不同。有足够多的不同按钮标题,我想首先构建这些按钮标题的数组,但我不知道如何将其转换为可变参数格式。
我想做这样的事情:
NSMutableArray *buttonTitles = [NSMutableArray array];
if (condition1) {
[buttonTitles addObject: @"Do action 1"];
}
if (condition2) {
[buttonTitles addObject: @"Do action 2"];
}
if (condition3) {
[buttonTitles addObject: @"Do action 3"];
}
if (condition4) {
[buttonTitles addObject: @"Do action 4"];
}
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: buttonTitles] autorelease];
现在显然,如果我必须这样做,我可以做这样的事情:
UIActionSheet *actionSheet = nil;
if (condition1 && condition2 && condition3 && condition4) {
actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", @"Do action 4", nil] autorelease];
} else if (condition1 && condition2 && condition3 && !condition4) {
actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", nil] autorelease];
}
// else ...
// about 14 other cases!
但这将是可怕的。有人知道一些不错的语法糖来帮助我吗?
编辑: 有人建议我使用 addButtonWithTitle
,从表面上看,它看起来很棒,但不幸的是,它将附加按钮放在取消按钮之后,这是不可取的。
我相信这是苹果代码的错误,因为他们的 addButtonWithTitle
文档指出:
// adds a button with the title. returns the index (0 based) of where it was added. buttons are displayed in the order added except for the
// destructive and cancel button which will be positioned based on HI requirements. buttons cannot be customized.
HI 要求(苹果自己的人机界面指南)倾向于在所有其他选项下方使用取消按钮,所以我想说苹果搞砸了。当然,这并没有真正帮助我,所以我又开始尝试在 NSArray 和 varargs 之间进行转换,但我仍然不知道该怎么做。
I have an action sheet with options that vary depending on the circumstances. There are enough different button titles that I would like to construct an array of those button titles first, but I can't figure out how to convert that into the varargs format.
I want to do something like this:
NSMutableArray *buttonTitles = [NSMutableArray array];
if (condition1) {
[buttonTitles addObject: @"Do action 1"];
}
if (condition2) {
[buttonTitles addObject: @"Do action 2"];
}
if (condition3) {
[buttonTitles addObject: @"Do action 3"];
}
if (condition4) {
[buttonTitles addObject: @"Do action 4"];
}
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: buttonTitles] autorelease];
Now obviously if I had to I could do something like this instead:
UIActionSheet *actionSheet = nil;
if (condition1 && condition2 && condition3 && condition4) {
actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", @"Do action 4", nil] autorelease];
} else if (condition1 && condition2 && condition3 && !condition4) {
actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", nil] autorelease];
}
// else ...
// about 14 other cases!
But that would be horrible. Anyone know some nice syntactic sugar to help me out?
EDIT:
It has been suggested that I use addButtonWithTitle
, which on the face of it looks great, unfortunately it this puts the additional buttons after the cancel button, which isn't desirable.
I believe this is bug with Apple's code since their documentation on addButtonWithTitle
states:
// adds a button with the title. returns the index (0 based) of where it was added. buttons are displayed in the order added except for the
// destructive and cancel button which will be positioned based on HI requirements. buttons cannot be customized.
HI requirements (Apple's own Human Interface guidelines) favor the cancel button below all other options, so I'd say Apple screwed up. Of course, that doesn't really help me, so I'm back to trying to convert between an NSArray and a varargs, which I still don't know how to do.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你可以试试这个
You can try this
Himanshu 答案的一个变体:
注意:你的 UIActionSheetDelegate 方法应该检查按钮标题而不是 buttonIndex:
我认为人们错过的关键细节是在 initWithTitle 选择器中设置 cancelButton,而不是在所有其他按钮之后添加它并指定外观通过调用 setCancelButtonIndex: 来取消按钮。
A variation on Himanshu's answer:
Note: your UIActionSheetDelegate method should check against button titles instead of buttonIndex:
I think the key detail people miss is setting the cancelButton in the initWithTitle selector, instead of adding it after all the other buttons and specifying the look of the cancel button by calling setCancelButtonIndex:.
为什么不直接做这样的事情:
Why not just do something like this:
这是我尝试过的一种方法,似乎效果很好。如果您想在按钮末尾、“取消”按钮之前添加一个附加按钮,则此方法有效。
如果不满足您的条件(条件 4),则可以在按钮列表末尾添加额外的“nil”。
我已经在iOS7上测试成功了。
Here is a method I tried that seems to work just fine. This works if you want to add an additional button at the end of the buttons, before the "cancel" button.
It appears to be okay to add an extra 'nil' at the end of the buttons list if your condition (condition4) is not met.
I've successfully tested this on iOS7.