xCode 6的iOS主从应用程序模板在iOS 7上无法运行

6
我正在尝试开发一个主从关系的iOS应用程序(仅限iPad), 从xCode 6的模板开始. 在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上对象类型不同:

  • iOS 8上,self.window.rootViewController是一个UISplitViewController
  • iOS 7上,self.window.rootViewController是第一个UINavigationController(左侧)

为什么会出现这种情况?


你是在 iPhone 还是 iPad 上进行测试? - Anil Varghese
4个回答

3

将这段代码放在prepareForSegue:下面,以确保向后兼容。

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

3
尝试使用此替代方法:
if ([splitViewController respondsToSelector:@selector(displayModeButtonItem)]){
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
}

1
它可以工作,但现在我只有“主视图”,没有“详细视图”了。 - Greg M.
啊,好的,所以我们需要在后面加上else{}来处理iOS8之前的版本。很抱歉,我没有分割视图项目。我需要查看xCode5中的SplitView模板。 - Jef
我正在下载xCode 5来测试它。 - Greg M.
它的工作原理是通过将xCode 6模板中的故事板替换为xCode 5模板... SplitViewController在我的xCode 6项目中显示方式与xCode 5不同。 - Greg M.
如果你仔细看看它在 appDelegate 中设置的位置,你可能会找到一种方法来使用我答案中的 ifRespondsToSelector: 内容使新内容在可能的情况下正常工作。从这些模板中可以学到很多东西,它们随着每个 xCode 的更新而改变,我猜想它们是由几个不同的工程师准备的,因为你可以看到其中几种不同的风格。干得好 :) - Jef

1

1

displayModeButtonItem 只在 iOS 8 或更高版本中可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接