UIActionSheet第一次显示正常,第二次显示不正确

时间:2013-07-14 21:28:01

标签: ios objective-c ipad uiactionsheet

我的一个iPad应用程序出现了一个奇怪的问题。

当应用程序启动时,我可以点击一个条形按钮项目来显示UIActionSheet,并且操作表正常显示来自条形按钮项目以及所有按钮选项和标题。但是,如果我从这个工作表中选择一个动作,它会使用presentViewController来显示另一个非常简单的视图控制器,当该视图控制器自行解除时,如果我点击同一个按钮项目,我会得到一个不正确的动作表。以下是操作表popover的样子:

enter image description here

操作表的高度对于操作表应该具有的选项数是正确的,但它就像标题和所有按钮文本都是空或零。但是,在创建操作表后,我会记录每个按钮的数量和按钮文本,从第一次到第二次,所有内容看起来都是一样的。

我使用最新的Xcode和SDK,该应用程序的目标是iOS 5.0或更高版本。关于发生了什么的任何想法?

编辑:这是一些代码。可能存在一些异常(语法和格式化),因为我必须删除一堆与此问题无关的代码。

按下维护按钮的IBAction:

-(IBAction) cmdMaintenance_Click:(id)sender
{
    self.maintenanceActionSheet = [[[UIActionSheet alloc] initWithTitle:@"Title"
                                                       delegate:self 
                                              cancelButtonTitle:@"Cancel"
                                         destructiveButtonTitle:nil
                                              otherButtonTitles:@"Backup", @"About", nil] autorelease];
    _maintenanceActionSheet.actionSheetStyle = UIActionSheetStyleDefault;
    _maintenanceActionSheet.tag = MAINTENANCE_OPTIONS;
    NSLog(@"Number of buttons: %d", _maintenanceActionSheet.numberOfButtons);
    for (int idx = 0; idx < _maintenanceActionSheet.numberOfButtons; idx++)
    {
        NSLog(@"Sheet button %d: %@", (idx + 1), [_maintenanceActionSheet buttonTitleAtIndex:idx]);
    }

    [_maintenanceActionSheet showFromBarButtonItem:cmdMaintenance animated:NO];
}

行动表委托:

-(void)actionSheet:(UIActionSheet*)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if(buttonIndex != [actionSheet cancelButtonIndex])
    {
            if(buttonIndex == OPTIONS_ABOUT)
            {
                if(aboutView == nil)
                {
                    aboutView = [[AboutViewController alloc] initWithNibName:@"AboutView-iPad" bundle:nil];
                    aboutView.title = [MyAppDelegate translateString:@"About"];
                }

                [self presentViewController:aboutView animated:YES completion:nil];
            }
    }
}

在我的关于视图控制器中,完成按钮代码:

-(IBAction)done:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

编辑2:最后一个注释......如果我用aboutView注释掉对presentViewController的调用,则操作表会正确返回。

编辑3:这里的问题归结为......世界上有什么可能导致UIActionSheet显示出我所看到的弹出窗口?我的主视图控制器还有其他区域显示UIActionSheet以询问用户反馈(例如删除客户),而这些其他区域显示与维护按钮相同的行为,即一个非常垂直薄的操作表。

编辑4:我将这些额外的代码放在我的视图控制器中,试图获得有关正在发生的事情的更多信息(并尝试影响操作表的大小):

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
{
    NSLog(@"willPresentActionSheet with frame %@ and bounds %@", NSStringFromCGRect(actionSheet.frame),
          NSStringFromCGRect(actionSheet.bounds));

    CGRect rect = actionSheet.frame;
    rect.size.width = 400.0;
    actionSheet.frame = rect;
}

- (void)didPresentActionSheet:(UIActionSheet *)actionSheet
{
    NSLog(@"didPresentActionSheet with frame %@ and bounds %@", NSStringFromCGRect(actionSheet.frame),
          NSStringFromCGRect(actionSheet.bounds));
}

尝试更改操作表的框架当然没有任何效果,这里是控制台中的输出:

2013-07-15 19:32:58.662 MyApp[12953:907] willPresentActionSheet with frame {{0, 0}, {272, 341}} and bounds {{0, 0}, {272, 341}}
2013-07-15 19:32:58.677 MyApp[12953:907] didPresentActionSheet with frame {{0, 0}, {272, 327}} and bounds {{0, 0}, {272, 327}}
2013-07-15 19:33:08.075 MyApp[12953:907] willPresentActionSheet with frame {{0, 0}, {0, 324}} and bounds {{0, 0}, {0, 324}}
2013-07-15 19:33:08.080 MyApp[12953:907] didPresentActionSheet with frame {{0, 0}, {0, 310}} and bounds {{0, 0}, {0, 310}}

前两行来自正常工作时,从后两行可以看出,由于某种原因,操作表的宽度为0。

1 个答案:

答案 0 :(得分:0)

好吧,饼干的关键(就像它一样)与应用程序中的self.window代码有关.finishLaunchingWithOptions方法。一旦我将这个应用程序切换到设置窗口的根视图控制器而不是将视图控制器的视图添加为窗口的子视图,它开始表现得更好。

再一次,我应该偶尔读一下我自己的博客......

http://www.dosomethinghere.com/2012/09/24/the-app-delegates-uiwindow-is-finicky/