导航后损坏的导航栏

Corrupted navigation bar after navigating

这是目前的情况:

UITabBarController
    UINavigationController
        UIPageViewController
            Some UIViewControllers (the actual content)

所以UIPageViewController包含一些UIViewControllers,它们都包含一个UITableView。

当我单击 UITableView 中的其中一行时,UIViewController 调用 didSelect 方法。该方法如下所示:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    let activity = self.activities[indexPath.row - 1]
    self.delegate?.dayTableViewSelectedActivity(activity, sender: self)
}

那么UIPageViewController 已经实现了协议,因此正在调用委托方法。该方法如下所示:

func dayTableViewSelectedActivity(activity: Activity, sender: DayTableViewController) {
    self.performSegueWithIdentifier("openDetails", sender: activity)
}

App 然后导航(推送)到 DetailViewController。当我向后滑动(默认 iOS 行为)时,DetailViewController 立即弹出到 UIPageViewController,没有动画。然后我的导航栏坏了,并且包含一个不属于那里的后退按钮,因为我不能再返回了。

当我再次单击一个单元格时,控制台会给我一条 nested push animation can result in corrupted navigation bar 消息。我从那里采取的每项行动都会给我更多的控制台错误,例如:

nested pop animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

这个错误让我沮丧了好几个小时,我不知道自己做错了什么。没有双重转场。我检查了很多次。希望大家帮帮我。

您需要确保在导航回 PageViewController 时使用 Unwind Segue。这会将 TableViewController 从堆栈顶部弹出,然后 return 您将转到 PageViewController。这是一篇关于如何在 Swift"

中使用它的不错的文章

https://www.andrewcbancroft.com/2015/12/18/working-with-unwind-segues-programmatically-in-swift/

经过几个小时的努力,我在这里找到了答案:

我的 UITTabBarController 确实有一个子类,它覆盖了 viewDidAppear 方法。我添加了 super.viewDidAppear,现在一切正常。