Ios 正确的行为在iPad上运行的iPhone应用程序加载带有~iPad扩展名的xib

Ios 正确的行为在iPad上运行的iPhone应用程序加载带有~iPad扩展名的xib,ios,xcode,ipad,interface-builder,xib,Ios,Xcode,Ipad,Interface Builder,Xib,我偶然发现了我认为iOS中的一些奇怪行为——搜索StackOverflow并没有发现与我的问题完全相同的东西 基本上,如果您有两个带有设备修饰符(~iphone和~ipad)的.xib文件,并且您在ipad上(即在iphone模拟器窗口内)运行iphone应用程序(非通用),它将尝试加载~ipad xib文件,而不是~iphone xib文件 这是虫子吗?我希望能够加载~iphone xib。即使实际的设备是iPad,它也在模仿iPhone,对吗?那么它肯定应该加载iPhone接口文件吗 复制步

我偶然发现了我认为iOS中的一些奇怪行为——搜索StackOverflow并没有发现与我的问题完全相同的东西

基本上,如果您有两个带有设备修饰符(~iphone和~ipad)的.xib文件,并且您在ipad上(即在iphone模拟器窗口内)运行iphone应用程序(非通用),它将尝试加载~ipad xib文件,而不是~iphone xib文件

这是虫子吗?我希望能够加载~iphone xib。即使实际的设备是iPad,它也在模仿iPhone,对吗?那么它肯定应该加载iPhone接口文件吗

复制步骤:

  • 在XCode中创建新的iPhone(非通用)应用程序-使用“单一视图”模板
  • 将ViewController.xib重命名为ViewController~iphone.xib
  • 复制并重命名xib,这样您就拥有了ViewController~iphone.xib和ViewController~ipad.xib
  • 在iPad模拟器中(或在实际的iPad设备上)运行此iPhone应用程序-加载的是~iPad XIB,而不是~iPhone XIB

  • 有人能建议我如何解决这个问题吗?这很复杂,因为我实际的XCode项目有多个目标(1.仅适用于iPhone的应用程序2.仅适用于iPad的应用程序),所以我需要支持所有场景,因此需要使用设备修饰符。

    我通常在使用NIB时这样做:

    - (id)init
    {
        if( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomiPhone )
        {
            nibNameString = @"mynib-iPhone";
        }
        else
        {
            nibNameString = @"mynib-iPad";
        }
        self = [super initWithnNibName:nibNameString bundle...
    

    我可以证实这种行为。我将我的*~ipad.xib重命名为*-ipad.xib,并使用[UIDevice currentDevice].UserInterfaceIDIOM在代码中选择适当的xib文件。我还认为发生的事情是你复制了一个iPhone笔尖,而它本应是一个ipad笔尖。尝试创建一个iPad项目,然后将nib从该项目复制到iPhone项目,而不是复制iPhone项目nib。