iPad上的操作表没有显示取消按钮

24

在 iPhone 上,这段代码会显示取消按钮:

- (IBAction)buttonPressed
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:@"Are you sure?"
                                  delegate:self 
                                  cancelButtonTitle:@"No way!"
                                  destructiveButtonTitle:@"Yes, I'm sure!"
                                  otherButtonTitles:nil];
    [actionSheet showInView:self.view];
    [actionSheet release];  
}

但在iPad上,只有破坏性按钮显示。
问题是什么?

6个回答

43

这是苹果公司的 UI 设计和指南 的一部分。在 "操作表" 下面,他们说:

不要包括"取消"按钮, 因为人们可以点击弹出窗口外部来关闭操作表格 而不选择其他替代方案之一。

看起来SDK有意隐藏了该按钮。我不确定是否有解决办法,但也许您可以添加自己的按钮并将cancelButtonIndex设置为相匹配的值。或者您可以切换到UIAlertView


是的,但在该段落下面,它还说:“动画操作表应包括一个取消按钮,因为人们需要能够关闭弹出窗口而不关闭操作表。图4-14显示了出现在地图中位置弹出窗口中的操作表。”这就是我想要实现的。 - user250781
1
如果您在弹出窗口中显示操作表,它是否仍会隐藏取消按钮?[sheet showInView:popOverController.view] - Alex Wayne
1
我通过将actionSheetStyle设置为UIActionSheetStyleBlackOpaque来解决了这个问题。我认为这并不违反指南的意图。感谢提供苹果开发者论坛消息的链接。 - user250781
1
更新:与文档一样,事情稍有变化,但这个答案和 Padawan 的第一个评论的主要观点是相同的。现在引用的话是:“如果显示操作表时没有动画,请不要包括取消按钮,因为人们可以点击弹出窗口之外的区域来关闭操作表而不选择其他选项之一。”可以在新网址找到。 - user577537

4
在iOS 5中,这对我有效。
- (void)manualAddModel
{
    UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle: @"Select Equipment Type"
                                                            delegate: self
                                                   cancelButtonTitle: @"Cancel"
                                              destructiveButtonTitle: nil
                                                   otherButtonTitles: @"Add Boiler", @"Add Furnace",  nil];

    popupQuery.actionSheetStyle = UIActionSheetStyleDefault;
    [popupQuery addButtonWithTitle:@"Cancel"];
    [popupQuery showInView:self.view];
}


- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0)
    {
        NSLog(@"Add Boiler");
    }
    else if (buttonIndex == 1)
    {
        NSLog(@"Add Furnace");
    }
    else if (buttonIndex == 2)
    {
        NSLog(@"Cancel Button Clicked");
    }
}

通常情况下,在iPad上点击操作表外部将起到相同的作用。

2

在iOS 4.2.1中,您可以像添加普通按钮一样手动添加自己的取消按钮:

[actionSheet addButtonWithTitle:@"Cancel"];

然后设置:

actionSheet.cancelButtonIndex = <your index>;

你不会得到红色的取消按钮,但是根据你的 UIActionSheetStyle 设置,你会得到蓝色或黑色的其中之一。无论如何,它与普通按钮非常明显地区分开来,并且可以正确地取消。
请注意,在我的情况下,我是在弹出控制器中显示操作表,你在其他情况下的结果可能会有所不同。

1
显然,cancelButtonIndex 没有被正确设置,即在委托方法中与操作表的取消按钮索引进行比较将无法按预期工作。 - mrueg

1

我通过设置 actionSheetStyle 解决了这个问题:

actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;

UIActionSheetStyleBlackTranslucent也可以使用。我正在从模态视图控制器中显示操作表,虽然我猜这不是技术上的“弹出控制器”,就像指南所说的那样,但当它出现在模态视图之上时,看不到取消按钮似乎不太对。用户只能看到一个可怕的红色按钮,没有可见的替代方案。

也许我可以将模态视图控制器更改为弹出控制器,但那样它就不会是模态的了,而它需要是模态的。

--更新--

虽然这很有趣,但在iOS 4.2中不再起作用。
我改用UIAlertView而不是UIActionSheet。
我不再得到一个酷炫的红色按钮,但它完成了工作。


实际上,它似乎也可以与UIActionSheetStyleDefault一起使用 - 只有UIActionSheetStyleAutomatic会隐藏取消按钮。 - Kuba Suder

1

当我尝试在另一个模态视图下方的视图中显示ActionSheet时,我遇到了同样的问题,例如,该视图是不可见的。虽然视图不为nil,但在框架深处似乎意味着它未显示。

通过设置不同的UIModalPresentationStyle modalPresentationStyle属性来解决了这个问题,使视图变得可见。

view.modalPresentationStyle = UIModalPresentationFormSheet;

1
根据iOS标准,当UIActionSheet在iPad中显示时,不会显示取消按钮,因为可以通过在ActionSheet区域之外的任何位置轻触来取消(隐藏)UIActionSheet。在iPhone的情况下,UIActionSheet将包含取消按钮。
请参考此链接以获取更多信息:iPad中的UIActionSheet取消按钮

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接