我正试图在iPad上显示UIActionSheet
。这是我正在使用的代码:
-(void) presentMenu {
UIActionSheet *popupMenu = [[UIActionSheet alloc] initWithTitle:@"Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:nil];
for (NSString *option in _menuItems) {
[popupMenu addButtonWithTitle:option];
}
popupMenu.actionSheetStyle = UIActionSheetStyleBlackOpaque;
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[popupMenu showFromTabBar:_appDelegate.tabBar.tabBar];
}
else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[popupMenu showFromBarButtonItem:self.navigationItem.rightBarButtonItem animated:YES];
}
[popupMenu release];
return;
}
该程序的iPhone版本显示_menuItems
中的所有按钮,但iPad版本只是忽略该阵列中的最后一项。有谁知道为什么会发生这种情况?
谢谢,
的Teja。
答案 0 :(得分:2)
我输入这篇文章后立即找到答案。以某种方式删除“取消”按钮会导致两个按钮都出现。怪异。
编辑:虽然,这真的很烦人,因为我的所有按钮索引都在iPhone和iPad版本之间变化(iPhone仍然需要取消按钮)。我该如何处理?答案 1 :(得分:0)
我认为iOS正在做的是它希望最后一个按钮成为取消按钮(无论是否),并将其删除,但可能只适用于iPad。这可能是因为用户可以点击外部操作表来解除它。我对Apple的设计选择存在的问题是,对话框可以或者应该以这种方式被解雇,这可能并不总是很明显。
例如,我通过调用[actionSheet showInView:self.view];
来显示我的操作表。这会导致整个视图变灰,并在设备中间显示操作表。用户将会 - 在我看来 - 正确地假设他们必须选择其中一个按钮。
据我所知,还有其他的操作表显示机制 - 比如将其显示为附加到条形按钮项的气泡 - 其中取消按钮显然是多余的。如果Apple在这里允许更多的灵活性,那就太好了。对于我的应用程序,我可能不得不在数组的末尾添加一个虚拟按钮,我将传递到我的自定义构造函数中,知道iOS会隐藏它。如果iOS的未来版本中的行为发生了变化......那么,我当时就必须解决这个问题。
在您的情况下,我建议不要使用带有cancelButtonTitle和destructiveButtonTitle的构造函数。相反,子类UIActionSheet并使用上面的方法手动添加按钮。然后,将cancelButtonIndex和destructiveButtonIndex设置为所需的索引。请记住,您没有 来设置这两个属性;它们默认为-1(没有按钮)。另外,请记住要遵守HIG关于按钮位置的信息。
这是我的一个子类'构造函数(为简洁起见),只是为了给你一个想法:
- (instancetype)initWithTitle:(NSString *)title
buttonTitles:(NSArray *)buttonTitles
cancelButtonIndex:(NSInteger)cancelButtonIndex
destructiveButtonIndex:(NSInteger)destructiveButtonIndex
{
self = [super initWithTitle:title delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
if (self)
{
if (buttonTitles)
{
[buttonTitles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
[self addButtonWithTitle:obj];
}];
}
self.cancelButtonIndex = cancelButtonIndex;
self.destructiveButtonIndex = destructiveButtonIndex;
if (self.cancelButtonIndex > -1)
{
[self addButtonWithTitle:@""];
}
}
return self;
}