1

如何为我的 iPhone 应用程序加载单独的 nib 文件,以检查用户是否拥有 iPhone 5/iPod Touch 4 英寸屏幕和 3.5 英寸屏幕?

这是在init方法中完成的吗?

详细信息 - 我没有为整个应用程序使用故事板。在某一时刻,我确实使用了故事板并从其中一个视图控制器中调用它。(有没有办法区分故事板?)

  • 我正在寻找一个在每个单独的 viewController 中初始化的解决方案......而不是我会放在只运行一次的 appdelegate 中的东西。

  • 对我来说,自动布局在很多情况下都不起作用。这些设计非常图形化,太多的空白使事情看起来很糟糕。

4

1 回答 1

3

我找到了办法!

  • 我制作了单独的笔尖文件,一个用于 3.5" / iPhone 非视网膜,一个用于 iPhone5
  • 我使用宏来检查当前手机是否为 iPhone 5 格式。(1)
  • 对于普通的 initWithNibName:bundle: 我写了一个异常,以便他们不使用普通的初始化程序。我把它命名为@“错误的初始化程序”
  • 我为 viewController 创建了一个新的指定初始化程序,将其命名为 initForFormat:
  • 我使用我的宏检查设备是否是 iPhone 5。如果是 iphone5,那么我使用 nib 名称 ViewControllerIphone5 进行初始化

我从 RayOfHope的https://stackoverflow.com/a/13068238/1492368获得了这个宏

 #define HEIGHT_IPHONE_5 568
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5 )

所以在新指定的初始化器initForLayout中:我写

if(IS_IPHONE_5)
    {
        self=[super initWithNibName:@"DetailViewControlleriPhone5" bundle:nil];
    }
    else
    {
        self=[super initWithNibName:@"DetailViewController" bundle:nil];
    }

旧初始化程序

我从 Big Nerd Ranch 学到了这一点:使用标准初始化程序时抛出异常

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{

    @throw [NSException exceptionWithName:@"Wrong initializer"
                                   reason:@"Use initForLayout:"
                                 userInfo:nil];
    return nil;
}

从另一个 ViewController/AppDelegate 调用 View Controller 所以当我从另一个 View Controller 或 appdelegate 调用这个 DetailViewController 时,我会写:

DetailViewController *detailViewController = [[DetailViewController alloc] initForLayout];
于 2013-01-08T16:25:02.360 回答