1

我的一个 iPad 应用程序有一个奇怪的问题。

当应用程序启动时,我可以点击一个条形按钮项以显示一个 UIActionSheet,并且操作表从条形按钮项正常显示,其中包含所有按钮选项和标题。但是,如果我从这张表中选择一个动作,它会使用 presentViewController 来显示另一个非常简单的视图控制器,并且当该视图控制器自行关闭时,如果我点击与之前相同的栏按钮项,我会得到一个不正确的动作表. 这是操作表弹出框的样子:

在此处输入图像描述

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

我使用的是最新的 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。

4

1 回答 1

0

好吧,饼干的症结(实际上)与应用程序 didFinishLaunchingWithOptions 方法中的 self.window 代码有关。一旦我切换此应用程序以设置窗口的根视图控制器而不是添加视图控制器的视图作为窗口的子视图,它的表现就会好得多。

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

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

于 2013-07-24T20:31:03.910 回答