按下 Navigation Controller 上的 EKEventViewController 并返回后出现白色底栏

White bottom bar appears after pushing EKEventViewController on Navigation Controller and returning

我正在开发一个应用程序,显示从 iOS 日历中获取的 table 事件。单击 table 中的一行时,我想使用 EKEventViewController 显示事件信息。以下是 table 事件的样子: 单击此列表中的事件时,我使用以下代码推送 EKEventViewController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    EKEventViewController *eventViewController = [EKEventViewController new];
    eventViewController.event = [self.events objectAtIndex:[indexPath row]];
    [self.navigationController pushViewController:eventViewController animated:YES];
    [self.navigationController setNavigationBarHidden:NO];
    [tableView reloadData];
}

我进入事件信息屏幕(正是我想要的):

但是当我现在点击左上角的后退按钮时,我会看到这个屏幕:

注意底部的白色条。为了摆脱这个栏我现在必须杀死应用程序,返回主菜单和应用程序的其他部分没有效果(每个屏幕只是 "shrunk" 以适应现在更小的 space ,可能是因为使用了自动布局)。

这不会发生在 iOS 7 上,此白条从未出现,仅在 iOS 8 上出现(8.2 已测试)。这个栏是什么以及如何摆脱它?

编辑:我注意到当屏幕截图发布在 Whosebug 上时,"white" 栏看起来是灰色的,而在设备上它肯定是白色的。

EDIT2:底部按钮的约束图片:

我从来没有发现白色条到底是什么,但我最终以模态方式展示了 EKEventViewController,效果很好:How to get a “Done” or “Back” button in an EKEventViewController when no having a navigation bar?

解决这个问题的另一种方法是通过故事板。 在故事板上创建一个 ViewController 对象 使其 class EKEventViewController(无需代码或 class 文件) 嵌入导航控制器。 从您希望调用 EKEventViewController 的视图控制器到 NavigationController

创建一个细节 segue

然后使用performSegueWithIdentifier("EKEventViewController", sender: sender)

像这样设置 prepareForSegue....

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "EKEventViewController" {
        let controller = (segue.destination as! UINavigationController).topViewController as! EKEventViewController
        controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
        controller.navigationItem.leftItemsSupplementBackButton = true
        controller.event          = event
        controller.allowsEditing  = true
        self.splitViewController?.toggleMasterView()
    }
}

我终于弄明白这种情况是怎么回事了。我通常不使用 UIToolbar,这就是为什么我没有早点意识到这一点,但是 UINavigationController 有一个可选的工具栏和一个功能 setToolbarHidden()

来自Displaying a Toolbar

部分

A navigation controller object manages an optional toolbar in its view hierarchy. When displayed, this toolbar obtains its current set of items from the toolbarItems property of the active view controller. [...] If not all of your view controllers support toolbar items, your delegate object can call this method to toggle the visibility of the toolbar during subsequent push and pop operations.

所以在推送 EKEventViewController 的视图控制器的 viewWillAppear() 中,调用:

self.navigationController?.setToolbarHidden(true, animated: false)

并且在将 EKEventViewController 压入堆栈调用时:

self.navigationController?.setToolbarHidden(false, animated: true).

您可以根据自己的喜好调整 animated 参数。