ios - UISplitViewController 的详情 View 推送错误

标签 ios iphone uinavigationcontroller uinavigationbar uisplitviewcontroller

我正在使用适用于 iOS8 的 UISplitViewController 实现一个通用应用程序,并且遇到了 UINavigation 的奇怪问题,非常感谢您的专业知识。

我的项目有以下 StoryBoard 布局:UINavigation in UISplitViewController

在 iPad 上,一切都按预期工作。但是,在 iPhone 上运行时,导航无法按预期工作。请看这个short video演示我从“详细信息屏幕 2”导航回“详细信息屏幕 1”时的导航问题。

我尝试在一个全新的项目中实现同样的场景,但我没有发现问题。只有在移植到我现有的项目中后,我才会看到这种行为。

更新 1:

这是我的 AppDelegate 代码:

    @interface AppDelegate () <UISplitViewControllerDelegate>

    @end

    @implementation AppDelegate

    -(BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions {

        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
        splitViewController.delegate = self;

        splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;

        return YES;
    }

    #pragma mark - Split view

    - (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {

        return YES;
    }

....
@end

更新 2:

感谢 PetahChristian,我认为他的以下观察是正确的:

To collapse a secondary view controller which has a navigation controller, Apple inserts the secondary navigation controller onto the primary navigation controller's stack. So, for the iPhone, where you see the problems, it looks like there is only one navigation controller, but there actually are two.

假设观察是正确的,如何防止辅助导航 Controller 推到主导航 Controller 上? UISplitViewControllerDelegate 方法仅处理直接链接到 UISplitViewController 的辅助 View Controller 的折叠逻辑。在我的例子中,要折叠的辅助 View Controller (即 Detail VC1)通过主视图 Controller 的“Show Detail(例如 Replace)”segue 和 UISplitViewControllerDelegate 方法在此转换期间不执行。

在全新项目中使用完全相同的设置,Apple 不会将辅助导航 Controller 插入主导航 Controller ,我在新项目中也没有遇到此问题。

非常感谢。

最佳答案

在我的项目中导致这种导航异常的罪魁祸首是我从 SO 用户那里下载的名为 UIViewController+BackButtonHandler 的扩展。此处理程序拦截导航后退按钮,因此我可以在用户按下后退时有机会做额外的工作。此类别扩展代码覆盖 navigationBar:shouldPopItem: 导致默认导航中断。我不知道这段代码正在执行,因为我没有使用它,而是只是合并到我的项目中。哇...用头撞墙 2 天。

关于ios - UISplitViewController 的详情 View 推送错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600857/

相关文章:

objective-c - ios拖放 subview 只能工作一次

ios - 在 iOS Phonegap 应用程序上序列化文件传输

具有核心数据、照片和 iCloud 的 iOS 应用程序

iphone - 如何在 Objective-c 的 UIlabel 中添加特殊字符?

ios - 如何将 UIViewController 推到 UINavigationController 之上(而不是内部)?

ios - 导航 Controller 不工作

iphone - 在 iPhone 和 iPad 上显示网站的整个宽度

iphone - 如何让我的 iPhone 应用程序在 iPhone 的 native 照片应用程序共享菜单中列出?

ios - 无法导航到 IOS Storyboard中的目标 View Controller

iPhone 开发,如何以编程方式从另一个选项卡调用 NavigationController 后退按钮?