使用NSArray的指定otherButtonTitles?(Use NSArray to spec

2019-08-31 07:00发布

UIAlertSheet的构造函数采用otherButtonTitles参数作为VARG列表。 我想从一个NSArray指定其他按钮的标题来代替。 这可能吗?

也就是说我必须这样做:

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

但自从我生成在运行时可用按钮列表,我真的希望是这样的:

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
}

这是一个很大的重复代码,但它实际上可能是合理的,因为我有最多三个按钮。 我怎样才能避免这种情况?

Answer 1:

这是一岁,但解决方案是非常简单的...做的@Simon建议,但没有指定一个取消按钮标题,所以:

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

但是,增加你的正常的按钮后,添加取消按钮,如:

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

[alert addButtonWithTitle:cancelString];

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

alert.cancelButtonIndex = [titles count];

我们做[titles count] ,而不是[titles count] - 1 ,因为我们是从按钮在列表中添加取消按钮作为额外的titles

现在,您还可以指定希望通过指定destructiveButtonIndex破坏性按钮(即红色按钮),该按钮(通常这将是[titles count] - 1按钮)。 另外,如果你保持取消按钮是最后一个按钮,iOS版将添加其他按钮和取消按钮之间的间距不错。

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



Answer 2:

而不是增加,当你初始化UIActionSheet按钮,尝试用一个for循环addButtonWithTitle方法,通过你的NSArray去加入他们。

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

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


Answer 3:

addButtonWithTitle:返回所添加的按钮的索引。 设置cancelButtonTitle在init方法零和添加额外的按钮运行此之后:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];


Answer 4:

- (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];
}


Answer 5:

您可以添加取消按钮,并设置它是这样的:

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


Answer 6:

我知道这是旧的文章,但如果别人像我一样,正在努力想出解决办法。

(这是由@kokemomuke回答,这主要是一个更详细的解释。在@Ephraim和@Simon此外,建造)

原来addButtonWithTitle的最后一个条目:需要是Cancel按钮。 我会使用:

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


文章来源: Use NSArray to specify otherButtonTitles?