iPad UIActionSheet - 不显示上次添加的按钮

时间:2011-10-06 18:01:49

标签: objective-c ipad uiactionsheet

我正试图在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。

2 个答案:

答案 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;
}