横向中的UIActionSheet具有不正确的buttonIndicies

时间:2011-04-21 13:46:38

标签: iphone ios landscape uiactionsheet

我有一张行动表让我对横向的iphone感到悲痛。一切都显示得很好,但在横向中,第一个真正的按钮与取消按钮具有相同的索引,因此逻辑不起作用。

我尝试使用initWithTitle创建actionSheet:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:但是这是一样的,我当前的代码如下;

UIActionSheet* actionMenu = [[UIActionSheet alloc] init];

actionMenu.delegate = self;
actionMenu.title = folderentry.Name;
actionMenu.cancelButtonIndex = 0;

[actionMenu addButtonWithTitle:NSLocalizedString(@"str.menu.cancel",nil)];

[self addActiveButtons:actionMenu forEntry:folderentry];
[actionMenu showInView:[self.navigationController view]];
[actionMenu release];

addActiveButtons方法基本上使用这样的代码配置要添加的按钮;

[menu addButtonWithTitle:NSLocalizedString(@"str.menu.sendbyemail",nil)];

有时可能有6个按钮,因此在横向模式下,actionSheet会显示如下;

action sheet

我的代表回应如此;

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

NSLog(@"Cancel Button Index is : %d",actionSheet.cancelButtonIndex);
NSLog(@"Button clicked was for index : %d",buttonIndex);

NSString *command = [actionSheet buttonTitleAtIndex:buttonIndex];

DLog(@"COMMAND IS: %@ for index: %d",command,buttonIndex);

if ([command isEqualToString:NSLocalizedString(@"str.menu.sendbyemail",nil)]) {

    // Do stuff here

}

if ( ... similar blocks ... ) { }

}

在显示的示例中,我发现cancelButtonIndex按预期为0,但第一个其他按钮的按钮索引也是如此!这意味着如果我点击第二个(保存到照片)按钮,例如,我的调试输出看起来像这样;

取消按钮索引为:0

点击

按钮用于索引:1

命令IS:通过电子邮件发送索引:1

我尝试过各种各样的排列,现在正在撕扯我的头发,想知道我错过了什么。我有一个很好的搜索,但人们似乎遇到的其他问题是显示问题,而不是功能问题。

谁能看到我出错的地方?

PS。我知道这不是最好的UI体验,但我认为大多数用户实际上会在大部分时间处于肖像状态或使用应用程序的iPad版本,所以我准备接受动态表格的默认行为,假设我可以让它实际工作!

4 个答案:

答案 0 :(得分:4)

好的,通过计算我添加的按钮数量然后添加取消按钮作为最后一个选项来修复它,所以我的代码看起来像这样;

int added = [self addActiveButtons:actionMenu forEntry:folderentry];

[actionMenu addButtonWithTitle:NSLocalizedString(@"str.menu.cancel",nil)];
actionMenu.cancelButtonIndex = added;

希望能帮助其他人在同一个问题上挣扎!

答案 1 :(得分:3)

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

将N个按钮添加到操作表后,它会切换它的布局,将Destructive按钮放在顶部,将Cancel按钮放在按钮上。中间是一个包含所有其他按钮的可滚动视图。其他来源表明这是一个表格视图。

对于iPhone,纵向方向的N为7,横向方向的N为5。这些数字适用于所有按钮,包括取消和破坏性。

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

问题是指数没有相应调整。因此,如果您最初没有将Cancel作为最后一个按钮并将Destructive作为第一个按钮添加,则将在actionSheet中报告错误的索引:clickedButtonAtIndex:作为初始报告说明。

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

答案 2 :(得分:0)

我遇到了同样的问题。要修复它,我只需为所有按钮创建一个nil的actionSheet,然后手动添加按钮。最后,在处理程序中,忽略firstOtherButtonIndex,因为它将是错误的(即使您提前设置它)。相反,假设它是1,因为索引0是此示例中的取消按钮。这是代码:

NSArray *items = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
UIActionSheet* actionSheet = [[[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil] autorelease];
[actionSheet addButtonWithTitle:@"Cancel"];
for (NSString *title in items) {
    [actionSheet addButtonWithTitle:title];
}
[actionSheet addButtonWithTitle:@"Destroy"];

// set these if you like, but don't bother setting firstOtherButtonIndex.
actionSheet.cancelButtonIndex = 0;
actionSheet.destructiveButtonIndex = [items count]+1;

此外,如果您在iPhone上,请不要忘记从标签视图中显示此内容,因为标签栏会窃取触摸事件并阻止下方按钮被击中。

答案 3 :(得分:0)

我的解决方案是像这样初始化,仅指定destructiveButtonTitle ...

    UIActionSheet * as =[[[UIActionSheet alloc] initWithTitle:nil
                                                 delegate:self 
                                        cancelButtonTitle:nil 
                                   destructiveButtonTitle:@"Cancel" 
                                        otherButtonTitles:nil] autorelease];
[as addButtonWithTitle:@"Button 1"];
[as addButtonWithTitle:@"Button 2"];

这样你就可以得到索引0处的取消按钮,即使有滚动视图,你自己的按钮也会从索引1开始。