3

在 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]];

control一个在哪里UISegmentedControl

处理按钮动作的代码是:

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

每次显示此操作表时,工具栏都会变为“空白”。不仅针对此视图,还针对其他视图。

下面是一个工作流程示例: 视图之间的流动

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

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

ListEmpyt工具栏

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

“列表”视图中还有另一个导航选项,显示“摘要”视图。根据数据,此视图将在工具栏中显示或不显示按钮: 摘要视图的统计信息

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

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

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

在关闭操作表或如何显示它时,我是否遗漏了什么?

如果您想了解更多信息,请告诉我。

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

2013 年 5 月 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 上运行它,无论我选择哪种流程,它都可以工作。

4

1 回答 1

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 或以某种方式使用空数组重置它们。

于 2013-05-23T21:15:47.230 回答