iPhone SDK - UIActionSheet - 动态按钮标题

时间:2009-10-26 15:26:06

标签: iphone objective-c

我在应用程序中有一个要求,我需要能够动态添加otherButtonTitles,这取决于用户在设置中指定的一些BOOL开关。但是,我似乎无法弄清楚如何在UIActionSheet初始化中执行此操作。我试图传递一个NSString数组(NSString [2]),也是一个没有运气的NSArray。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:58)

我找到的最简单的方法是创建没有按钮的操作表,包括没有取消或破坏性按钮:

UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"Dynamic"
                                                        delegate:self
                                               cancelButtonTitle:nil
                                          destructiveButtonTitle:nil
                                               otherButtonTitles:nil];

然后根据需要添加一些按钮:

if(buttonX)
{
    [actionSheet addButtonWithTitle:@"Button X"];
}
if(buttonY)
{
    [actionSheet addButtonWithTitle:@"Button Y"];
}
if(buttonZ)
{
    [actionSheet addButtonWithTitle:@"Button Z"];
}

然后最后在结尾添加取消按钮并设置取消按钮索引:

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

当然,您可以通过这种方式添加取消按钮和/或破坏性按钮。

答案 1 :(得分:6)

您可以使用addButtonWithTitle:方法向(已初始化的)UIActionSheet添加新按钮。您还可以创建自定义UIButtons并将它们作为子视图添加到UIActionSheet的视图

答案 2 :(得分:2)

我最终通过使用一些nil字符串和数组来解决这个问题。我将所需的动态标题放在一个数组中,然后遍历它并根据需要设置占位符字符串。然后,占位符字符串将在操作表初始化中传递给otherButtonTitles:。由于otherButtonTitles:以nil结尾,您可以根据需要传递尽可能多的占位符字符串,因为第一个零占位符将终止其余的。

// button titles    
NSMutableArray *buttons = [[NSMutableArray alloc] init];
[buttons addObject:@"Button 1"];
[buttons addObject:@"Button 2"];

// placeholders
NSString *button0 = nil, *button1 = nil, *button2 = nil;

// put together the buttons
for (int x = 0; x < buttons.count; x++) {
    switch (x) {
        case 0:
            button0 = [buttons objectAtIndex:x];
            break;
        case 1:
            button1 = [buttons objectAtIndex:x];
            break;
        case 2:
            button2 = [buttons objectAtIndex:x];
            break;
    }
}

// action sheet
UIActionSheet *option = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:button0, button1, button2, nil];

希望这对面临类似困境的其他人有所帮助。

答案 3 :(得分:1)

如果您需要那么多按钮,请创建自己的模态视图和您自己的委托协议。

查看presentModalViewController:animateddismissModalViewController:animated:

的文档

当用户取消您的模态视图时,您的代理人可以收到您构建的方法,例如customActionSheetDidFinish:(int)buttonChosen