从中显示UIActionSheet后,导航控制器工具栏变为空白

时间:2013-05-07 15:31:58

标签: ios cocoa-touch uikit

在iOS 6.1(模拟)和6.1.3(物理设备)应用程序的iOS运行中,我们使用以下代码从视图中显示UIActionSheet:

  UIActionSheet *actionCreateNewComment = [[UIActionSheet alloc] initWithTitle:CLocalised(@"EditExistingComment") delegate:self cancelButtonTitle:CLocalised(@"No") destructiveButtonTitle:nil otherButtonTitles: CLocalised(@"Yes"), nil];
[actionCreateNewComment setActionSheetStyle:UIActionSheetStyleBlackOpaque];
[actionCreateNewComment setTag:ActionSheetTagNewComment];
[actionCreateNewComment showFromToolbar:self.navigationController.toolbar];
[actionCreateNewComment release];

“视图”设置工具栏:

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:control];
[self setToolbarItems:[NSArray arrayWithObject:item]];

其中controlUISegmentedControl

处理按钮操作的代码是:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    bool shouldAddNewComment = buttonIndex == [actionSheet cancelButtonIndex];
    [self navigateToCommentScreen:shouldAddNewComment];
}

每次显示此操作表时,工具栏将变为“空白”。不仅适用于此视图,还适用于其他视图。

以下是工作流程的示例: Flowbetween Views

请注意,如果我在没有UIActionSheet的情况下从Instr导航到Comment,但是相同的代码,则不会出现问题。

这里的问题是在“Instr”视图中工具栏为空。 如果我再弹出两个视图返回“列表”,它的工具栏也将为空:

ListEmpytToolbar

即使我然后导航回WO和Instr,通过分配和初始化新表单,然后推送它们,工具栏仍然是空的。

“列表”视图中还有另一个导航选项,显示“摘要”视图。根据数据,此视图将显示工具栏中是否带有按钮: Stats of summary view

“摘要按钮”和“摘要为空”都是预期的视图。在在Inst和Comment之间导航之前显示UIActionSheet之后显示“隐藏摘要”。 但是,如果我导航到图片中显示为“摘要空”的“摘要”视图(由于数据而打算),则工具栏将再次开始工作。或者至少在我再次从Instr视图中显示UIActionSheet之前。

在我看来,有一些奇怪的事情:

  • 如果我导航到工具栏为空的视图(隐藏工具栏),请参见图片:“SummaryEmpty”,然后工具栏将在其他视图中按预期显示。
  • 我们使用相同的代码在应用程序的其他视图中显示操作表而没有任何问题
  • 如果我在模拟的iOS 5.1或模拟的iOS 5.0上运行应用程序,则问题不会出现

在解雇行动单或如何展示时,我是否遗漏了一些内容?

如果您想了解更多信息,请与我们联系。

更新: 如果我在操作表按钮事件后强行调用[self setToolbarItems:nil],然后使用与工具栏按预期显示之前相同的项目更新它。 这不是正确的做法。

更新2013-05-28: 感谢@LOP_Luke,我发现如果我没有从-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex导航到“评论”视图,但只是返回,工具栏将重新开始工作。 那么,当clickedButtonAtIndex仍然在调用堆栈上时导航到另一个视图时会出现某种问题吗?

更新2013-05-29 : 如果我添加一个方法:

-(void)commentScreenYes{
  [self vanigateToCommentScreen:YES];
}

将按钮代码更改为:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    bool shouldAddNewComment = buttonIndex == [actionSheet cancelButtonIndex];
    if(shouldAddNewComment){
        [self performSelectorOnMainThread:@selector(commentScreenYes) withObject:nil waitUntilDone:NO];
        return;
    }
    [self navigateToCommentScreen:shouldAddNewComment];
}

然后它将用于取消按钮,但不适用于是按钮。取消按钮也会在工具栏被“是”按钮“断开”后再次工作。如果我通过此流程管道两个按钮(通过添加新方法),它们都将工作。 而且,如果我在iOs 5.1上运行它,无论我选择哪种流程都会有效。

1 个答案:

答案 0 :(得分:2)

– setToolbarItems方法是特定于导航控制器的每个子视图控制器的UIViewController方法。假设[self navigateToCommentScreen:shouldAddNewComment]将新的视图控制器推送到导航堆栈,您将不得不将新视图控制器的工具栏项设置为单独的调用,而不管操作表正在执行什么操作。例如,

-(void) navigateToCommentScreen:(bool) shouldAddComment{
    CommentViewController* viewController = [[CommentViewController alloc] init];

    [self.navigationController pushViewController:viewController animated:YES];

    [viewController setToolbarItems:self.toolbarItems];
}

否则新视图控制器将没有工具栏项,工具栏将为空白。

修改

我创建了一个带有根视图控制器的导航控制器,该控制器具有带UISegmented控件的工具栏。我通过UIActionSheet委托方法将新的视图控制器推送到导航堆栈,然后将其弹出。工具栏正是它应该在根视图控制器上的方式(分段控件按预期淡入)。对于设置导致它们消失的工具栏项目,您必须对控制器执行更复杂的操作。没有看到你的viewController的源方法,很难说出问题所在。确保您没有将工具栏项设置为nil或以某种方式使用空数组重置它们。