模态视图控制器显示在操作表后面

时间:2010-12-15 18:15:48

标签: iphone objective-c cocoa-touch uiviewcontroller uiactionsheet

我的模态视图控制器显示在我的UIActionSheet后面,而我的UIActionSheet并没有被解雇。我正在使用:

[self presentModalViewController:composeTweetView animated:YES];

呈现我的模态视图控制器。

我的行动表正在tabBar中显示:

[actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar];

此代码适用于iOS 4.0。

if (buttonIndex == 0) {
        if (self.isLoggedIn) {
            [FlurryAPI logEvent:@"ST_REPLY_CLICKED"];
            composeTweetView.isDirectMessage = FALSE;
            [self presentModalViewController:composeTweetView animated:YES];
            [composeTweetView release];
        }
        else {
            LoginViewController* loginView = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
            loginView.delegate = self;
            loginView.isPostingComment = TRUE;
            self.isReply = TRUE;
            [self presentModalViewController:loginView animated:YES];
            [loginView release];
            [composeTweetView release];
        }
    }

要点:

我有一个包含UITabBar的UIViewController。我正在展示一个UIActionSheet,它有几个按钮,提供模态视图控制器。当呈现模态视图控制器时,UIActionSheet应解除其自身,并且模态视图应位于堆栈的顶部。问题是,UIActionSheet没有被忽略,并且模态视图被加载在它后面。直到iOS 4.2.1才出现此问题

重现步骤:

  1. 创建一个TabBar项目,进行设置 您的iOS SDK到iOS 4.2.1
  2. 创建一个按钮或触发器以显示UIActionSheet
  3. 允许UIActionSheet中的一个按钮使用以下语法显示模态视图控制器:[actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar];
  4. 预期结果:

    1. The UIActionSheet should dismiss itself, and the modal view should appear in front
    

    实际结果:

    1. The UIActionSheet does not get dismissed and the modal view appears behind it.
    

    回归:

    This problem was not apparent prior to iOS 4.2.1
    

    备注: 我已经尝试过显示UIActionSheet的其他方法,所有这些方法都不能按预期工作:

    //[actionSheet showInView:self.parentViewController.tabBarController.tabBar];
    //[actionSheet showInView:[self.view window]];
    //[actionSheet showInView:self.parentViewController.tabBarController.view];
    //[actionSheet showInView:[UIApplication sharedApplication].keyWindow];
    

8 个答案:

答案 0 :(得分:2)

在整理样本以重现您的问题时,我看了一下UIActionSheet委托方法。我相信你可以使用:

actionSheet:didDismissWithButtonIndex:

而不是

actionSheet:clickedButtonAtIndex:

我还没有对它进行测试,但我相信你仍然得到相同的按钮编号,直到动作表从视图中消失后它才会触发。

答案 1 :(得分:2)

我不明白你的问题对不起,但一切都对我有用。我在模拟器和4.2.1 iPod Touch 4G(都工作过)中尝试了以下代码

- (IBAction)doit {
    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"title" delegate:self cancelButtonTitle:@"not OK" destructiveButtonTitle:@"Absolutely" otherButtonTitles:nil];
    [actionSheet showFromTabBar:self.tabBarController.tabBar];
    [actionSheet release];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0) {
        UIView *v = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
        v.backgroundColor = [UIColor redColor];
        [self.view addSubview:v];
        [v release];
    }
}
  1. 创建了TabBar示例项目
  2. 向firstView-nib添加了按钮并与相应的IBAction相关联(必须将FileOwner命名为FirstViewController
  3. FirstViewController.h<UIActionSheetDelegate>
  4. 中设置委托方法
  5. 添加了上面的代码
  6. //编辑:好的,我看到你想以模态方式呈现它,但即使这对我来说也适用于4.2.1

    TMPController *tmp = [[TMPController alloc]initWithNibName:@"TMP" bundle:nil];
    [self presentModalViewController:tmp animated:YES];
    [tmp release];
    

    也许它有效,因为我使用self.tabBarController.tabBar,试试

答案 2 :(得分:1)

不确定您是否已经解决了这个问题。但我上面没有看到明确的答案。我和你有完全相同的问题。所以最后,这是我的一个问题,但帮我调试的是在方法中添加实际的动作代码

actionSheet:didDismissWithButtonIndex: 
马太建议

这证明该观点实际上被驳回了。就在那时我意识到我在我的viewWillAppear方法中放了UIActionSheet alloc。因此,每次出现视图时,它都会重新创建操作表。

答案 3 :(得分:0)

这似乎很奇怪,因为SDK文档声明:

  

actionSheet:clickedButtonAtIndex:   ...   调用此方法后,接收器将自动关闭。

我可以想到它可能不会消失的3种可能性:

  1. 不会调用处理动画和显示内容的主runloop(主线程!)。你是否在同步网络呼叫的主线程中工作繁重? (注意SDK文本中的“after”一词)
  2. 不知何故,您计划多次显示操作表
  3. 以模式方式显示相同的视图控制器实例,该实例已位于视图堆栈当前视图下方的某处。

答案 4 :(得分:0)

我刚刚编写了一个快速示例应用程序来测试它,它就像我预期的那样工作(即,我无法重复你的问题)。 有点不同,因为我没有做TabBar应用程序,但我仍然希望这会有所帮助。我对UIActionSheet所做的就是这样展示:[actionSheet showInView:self.view]。也许这会奏效?

很抱歉匆忙的回答,当我引起我的注意时,我正在出去。 :)

答案 5 :(得分:0)

iOS 4.2也遇到过这样的问题。 我认为您应该尝试以下步骤:

  1. 为单击操作表按钮时要执行的代码创建单独的方法。假设该方法是 - (void)presentModalView {}
  2. 2.现在 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 方法,为点击的方法调用 presentModalView {} 方法像这样的按钮索引:

    if(buttonIndex==0)
    {
    [self performSelector:@selector(presentModalView) withObject:nil afterDelay:0.3];
    }
    

    3.您也可以尝试不同的延迟时间。

    希望有所帮助......

答案 6 :(得分:0)

我有同样的问题从AlertBox / ActionSheet调用MailComposeView导致MailCompseView落后于隐形屏幕。

我通过在actionSheet按钮处理程序中调用dismissWithClickedButtonIndex:animated来解决它。

答案 7 :(得分:0)

问题已在iOS5中解决。