【问题标题】:Change the view for different devices更改不同设备的视图
【发布时间】:2014-10-02 14:54:14
【问题描述】:

我有一个只能在 iphone 中运行的项目,适用于版本 4、5 和 6。在我的情况下,我使用的是 xib 文件,在这种情况下,我使用 xib 文件创建了一个名为 ViewController 的类,然后再创建了三个 xib 文件,导致您具有以下结构:

ViewController.h
ViewController.m
ViewController.xib
ViewController4inch.xib
ViewController47inch.xib
ViewController55inch.xib

在我的 ViewController.m 中,我将这段代码放在 ViewDidLoad 中,以识别 iphone 的版本并将视图更改为用户:

- (void)viewDidLoad {
    [super viewDidLoad];

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {

        ViewController *extratoVC = [[ViewController alloc] init];

        if([UIScreen mainScreen].bounds.size.height == 480){

            // 4-4s
        extratoVC = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

        }

        if([UIScreen mainScreen].bounds.size.height == 568){

            // 4-inch
        extratoVC = [[ViewController alloc] initWithNibName:@"ViewController4inch" bundle:nil];

        }

        if([UIScreen mainScreen].bounds.size.height == 667){

            // 4.7-inch
        extratoVC = [[ViewController alloc] initWithNibName:@"ViewController47inch" bundle:nil];

        }

        if([UIScreen mainScreen].bounds.size.height == 736){

            // 5.5-inch
        extratoVC = [[ViewController alloc] initWithNibName:@"ViewController55inch" bundle:nil];

        }

        [self presentViewController:extratoVC animated:YES completion:nil];// this line causing problem that you see below...

    }

}

不幸的是,此代码不起作用,我收到以下错误消息:

Thread1: EXEC_BAD_ACCESS (code = 2, address = 0xbf72bfbc) 

在我的项目中,所有视图都将由类处理 ViewController.h / .m

就我而言,我正在处理 .xib 文件并且不想使用情节提要,有人知道为什么会出现这个问题以及如何解决它吗?

【问题讨论】:

  • 这不是好的做法。为什么不使用带约束的自动布局?
  • 在 if 语句上设置断点并单步执行时会发生什么?它通过异常在哪一行?
  • 想象一下,如果您尝试在 Android 应用程序中执行此操作会发生什么。这是否让您了解为什么这可能是一个坏主意?

标签: ios objective-c iphone xcode uiviewcontroller


【解决方案1】:

这是不好的做法。但是如果你想找到你的代码中断的地方,你可以添加一个异常断点。就像这里解释的:https://developer.apple.com/library/ios/recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html

【讨论】:

    【解决方案2】:

    您正在初始化viewDidLoad 中的视图。此方法总是在初始化过程之后调用。你不能在那里初始化视图。

    你在哪里初始化 ViewController?此时,您应该使用正确的 xib 文件名调用 initWithNibName:。然后,呈现 viewController。

    除此之外,我强烈建议您使用更新的方式来实现这一点。例如,您可以尝试 Size 类,这样您就可以为多个设备配置一个故事板。这里:http://www.learnswift.io/blog/2014/6/12/size-classes-with-xcode-6-and-swift

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多