使用6个以上的自定义按钮时,UIActionSheet buttonIndex值是否有问题?

时间:2011-03-10 16:11:46

标签: iphone ios uiactionsheet

我在iPhone(iOS 4.2)上使用UIActionSheet时发现了一个奇怪的问题。请考虑以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

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

    [actionSheet addButtonWithTitle:@"one"];
    [actionSheet addButtonWithTitle:@"two"];
    [actionSheet addButtonWithTitle:@"three"];
    [actionSheet addButtonWithTitle:@"four"];
    [actionSheet addButtonWithTitle:@"five"];
    [actionSheet addButtonWithTitle:@"six"];
    //uncomment next line to see the problem in action
    //[actionSheet addButtonWithTitle:@"seven"];

    [actionSheet showInView:window];
    [actionSheet release];

    return YES;
}
- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"buttonIndex: %d, cancelButtonIndex: %d, firstOtherButtonIndex: %d",
          buttonIndex, 
          actionSheet.cancelButtonIndex, 
          actionSheet.firstOtherButtonIndex);
}

如果启动此应用程序,则操作表将按预期运行。这意味着cancelButtonIndex始终为0,并且正确报告按钮索引。按钮“1”依次为1,依此类推。如果您在添加第七个按钮的行中注释,则操作表会生成一种tableview,并在额外的行上显示取消按钮。如果在这种情况下我按下“one”按钮,则buttonindex变量为0,但cancelButtonIndex也是如此。无法判断用户是否点击了“取消”或“一个”按钮。这似乎不应该是这样的。有人不同意吗?谢谢你的帮助。

5 个答案:

答案 0 :(得分:34)

我遇到了同样的问题,即使我已经将取消按钮作为操作表中的最后一个并相应地设置其索引。我的问题与“破坏性”按钮有关。经过一番调查,这是我对这个问题的看法:

  • 将N个按钮添加到操作表后,它会切换其布局,将“破坏性”按钮置于顶部,将“取消”按钮置于底部。中间是一个包含所有其他按钮的可滚动视图。其他来源表明这是一个表格视图。

  • 纵向方向的N为7,横向方向的N为5。在较大的4英寸屏幕上,N为9表示纵向。这些数字适用于所有按钮,包括取消和破坏性。要清楚,N是切换前最大的按钮数.N + 1按钮使UIActionSheet切换到可滚动的视图。

  • 您最初在操作表中放置取消和破坏性按钮的操作表中的位置无关紧要。达到限制后,“破坏性”按钮将移至顶部,“取消”将移至底部。

  • 问题是指数没有相应调整。因此,如果您最初没有将“取消”添加为最后一个按钮而将“破坏性”添加为第一个按钮,则会在actionSheet中报告错误的索引:clickedButtonAtIndex:如初始报告所述。

  • 因此,如果您的操作表中有超过N个按钮,则必须将“毁灭性”按钮添加到actionSheet,作为操作表的第一个按钮。您必须添加取消按钮作为添加到操作表的最后按钮。在最初构建工作表时,只需将两者都保留为零,如另一个答案中所述。

答案 1 :(得分:13)

我刚遇到这个问题。通过最初不设置取消按钮来解决它。我按钮设置了这样的按钮:

   for(int index = 0; index < buttonTotal; index++)
   {
    [actionSheet addButtonWithTitle:[NSString stringWithFormat:buttonText, [buttonItems objectAtIndex: index]]];
   }

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

我相信destructiveButton使用零索引,如果你使用它,那么其他按钮将从那里开始增加,否则它们将从0开始。

不确定我同意表格选项,因为超过一定金额,按钮默认为可滚动列表。

答案 2 :(得分:1)

file a bug关于这个问题。包括一个小样本项目,并等待几个月来听取他们的回复。

现在您可以在init

中静态设置按钮
UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                              initWithTitle:@"TestSheet" 
                              delegate:self 
                              cancelButtonTitle:@"Cancel" 
                              destructiveButtonTitle:nil 
                              otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", nil];

没有问题。

答案 3 :(得分:1)

1)使用

实例化动作视图
  

[[UIActionSheet alloc]   InitWithTitle:委托:cancelButtonTitle:destructiveButtonTitle:OtherButtonTitles:]

没有取消按钮或破坏性按钮(将它们设置为零)

2)使用[myActionSheet addButtonWithTitle:(NSString *)]正常添加所有按钮。

3)如果你想要一个特殊的按钮,使用与步骤2相同的方法添加它,并将标题设置为任何(例如@"Cancel");

4)现在将属性[myActionSheet setCancelButtonIndex:]设置为操作表上​​最后一个按钮的索引,这是取消按钮。对破坏性按钮执行相同操作。 (默认情况下为-1,导致它们不显示)

  • 请注意,破坏性按钮将始终显示在顶部,并且取消按钮将始终显示在底部,无法更改。

  • 此外,您当然可以在索引0处添加取消/破坏性按钮,然后添加所有其他按钮。但是现在你的其他按钮的第一个索引是1,而不是零。如果您有一个与alertview按钮对应的数组,这可能会造成混淆。

答案 4 :(得分:0)

如下所示:

UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                              initWithTitle:@"TestSheet" 
                              delegate:self 
                              cancelButtonTitle:@"Cancel" 
                              destructiveButtonTitle:@"Delete" 
                              otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", nil];

这意味着将破坏性按钮定义为destructiveButtonTitle。使用otherButtonTitles中的破坏性/取消按钮避免。