如何将字符串数组发送到UIActionSheet varargs init方法?

Mic*_*ine 7 iphone objective-c variadic-functions uiactionsheet ios

我有一个行动表,其选项根据具体情况而有所不同.有足够的不同按钮标题,我想首先构建这些按钮标题的数组,但我无法弄清楚如何将其转换为varargs格式.

我想做这样的事情:

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];
Run Code Online (Sandbox Code Playgroud)

现在显然,如果我必须,我可以做这样的事情:

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!
Run Code Online (Sandbox Code Playgroud)

但那太可怕了.有人知道一些很好的语法糖来帮助我吗?

编辑: 有人建议我使用addButtonWithTitle,它看起来很棒,不幸的是,它在取消按钮后放置了额外的按钮,这是不可取的.

我相信这是Apple代码的错误,因为他们的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.
Run Code Online (Sandbox Code Playgroud)

HI要求(Apple自己的人机界面指南)赞成取消按钮低于所有其他选项,所以我说Apple搞砸了.当然,这并没有真正帮助我,所以我回到尝试转换NSArray和varargs,我仍然不知道该怎么做.

Him*_*dav 18

你可以试试这个

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"];
}
[buttonTitles addObject: @"Cancel"];
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil] autorelease];

for (NSString *title in buttonTitles) {
    [actionSheet addButtonWithTitle: title];
}

[actionSheet setCancelButtonIndex: [buttonTitles count] - 1];
Run Code Online (Sandbox Code Playgroud)


Cod*_*die 5

Himanshu答案的一个变种:

    UIActionSheet * as = [[UIActionSheet alloc] initWithTitle:@"Share" 
                                                 delegate:self 
                                        cancelButtonTitle:nil /* don't set Cancel title here! */
                                   destructiveButtonTitle:nil 
                                        otherButtonTitles:nil];
int cancelButtonIndex = 0; // will remain 0 if no other buttons besides "Cancel"
if ( canShareBySMS )
{
    [as addButtonWithTitle:kSMSButtonText];
    cancelButtonIndex++;
}
if ( canShareByMail )
{
    [as addButtonWithTitle:kEmailButtonText];
    cancelButtonIndex++;
}
/* etc. */

// after all other buttons have been added, include Cancel
[as addButtonWithTitle:@"Cancel"];
[as setCancelButtonIndex:cancelButtonIndex];

[as showInView:self.sharingViewController.view];
[as release];
Run Code Online (Sandbox Code Playgroud)

注意:您的UIActionSheetDelegate方法应检查按钮标题而不是buttonIndex:

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {
    if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:kSMSButtonText]) {
    //share via sms
    }else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:kEmailButtonText]) {
    //share via mail
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为最关键的细节让人怀念被设置cancelButton在initWithTitle选择,而不是所有的其他按钮后,加入它,并通过调用setCancelButtonIndex指定取消按钮的外观:.