【问题标题】:iOS Master-Detail application template from xCode 6 doesn't run on iOS 7xCode 6 的 iOS Master-Detail 应用程序模板无法在 iOS 7 上运行
【发布时间】:2015-01-02 17:30:56
【问题描述】:

我正在尝试从 xCode 6 模板开发一个主从 iOS 应用程序(仅限 iPad)。它在 iOS 8 上运行良好,但在 iOS 7.0 或 7.1 上运行时会在我评论的运行时崩溃:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *navigationController = [splitViewController.viewControllers lastObject];

    // this line throws a "[MasterViewController topViewController]: unrecognized selector sent to instance 0x796dde90"
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
    splitViewController.delegate = self;
    return YES;
}

重现错误:

  • 打开 xCode 6
  • 文件 > 新建 > 项目
  • 选择“iOS 应用”下方的“主从应用”
  • 将项目目标更改为 7.0
  • 在模拟器或设备上运行

我进行了调查,似乎 iOS 7 和 iOS 8 上的对象类型不同:

  • 在 iOS8 上,self.window.rootViewController 是一个 UISplitViewController
  • 在 iOS7 上,self.window.rootViewController 是第一个 UINavigationController(左)

为什么会有这种行为?

【问题讨论】:

  • 您是在 iPhone 还是 iPad 上进行测试?

标签: ios objective-c xcode ipad master-detail


【解决方案1】:

将其放在prepareForSegue: 下以确保向后兼容。

DetailViewController *controller;
    if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) {
        controller = (DetailViewController *)[[segue destinationViewController] topViewController];
    }
    else {
        controller = (DetailViewController *)[segue destinationViewController];
    }
[controller setDetailItem:object];

【讨论】:

    【解决方案2】:

    试试这个替换:

    if ([splitViewController respondsToSelector:@selector(displayModeButtonItem)]){
        navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
    }
    

    【讨论】:

    • 它可以工作,但现在我只有“主”视图。没有更多的“细节”视图。
    • 嗯好的,所以我们需要一个 else{} 来处理 pre iOs8。抱歉,我没有拆分视图项目。我需要查看 xCode5 中的 splitView 模板
    • 我目前也在下载 xCode 5 进行测试。
    • 它的工作原理是将 xCode 6 模板中的情节提要替换为 xCode 5 之一...SplitViewController 现在在我的 xCode 6 项目中显示不同,就像在 xCode 5 中一样。
    • 好吧,如果你仔细看看它在 appDelegate 中的全部设置位置,你可能会找到一种方法来使用我的答案中的 ifRespondsToSelector: 东西来让新东西尽可能地工作。从这些模板中可以学到很多东西,它们随着每次 xCode 更新而变化,我怀疑它们是由几个不同的工程师准备的,因为你可以在它们中看到一些不同的样式。干得好:)
    【解决方案3】:

    工程师似乎忘记检查他的模板的向后兼容性。使用 xCode 5.1.1 master-details 模板中的情节提要解决了这个问题。对于那些来自 Google 的人,您可以在这里下载 xCode 5.1.1:https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg

    【讨论】:

      【解决方案4】:

      displayModeButtonItem 仅适用于 iOS 8 或更高版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        相关资源
        最近更新 更多