Ios iPad通用应用程序未加载iPad.xib文件?

Ios iPad通用应用程序未加载iPad.xib文件?,ios,ipad,xib,universal,Ios,Ipad,Xib,Universal,我一直在试图弄清楚为什么会发生这种情况,但在我的通用应用程序的iPad版本中,它似乎正在加载iPhone.xib而不是iPad 我用后缀~iPhone.xib给我的iPhone-xibs命名,我把我的iPad-xib留给了.xib。我读书是为了这么做,因为有人说这对他们有用,但对我来说,这对我不起作用 即使我对不同的.xib文件使用~ipad.xib和~iphone.xib,它仍然会加载iphone版本 **有没有办法完全确认它加载的是iPhone版本而不是iPad版本? 有没有办法解决这个问题

我一直在试图弄清楚为什么会发生这种情况,但在我的通用应用程序的iPad版本中,它似乎正在加载iPhone.xib而不是iPad

我用后缀~iPhone.xib给我的iPhone-xibs命名,我把我的iPad-xib留给了.xib。我读书是为了这么做,因为有人说这对他们有用,但对我来说,这对我不起作用

即使我对不同的.xib文件使用~ipad.xib和~iphone.xib,它仍然会加载iphone版本

**有没有办法完全确认它加载的是iPhone版本而不是iPad版本?

有没有办法解决这个问题,让iPad加载iPad.xibs?***

谢谢

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

// Override point for customization after application launch.
    self.viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

在我的应用程序中,我是这样做的。我为iPad视图创建单独的.h、.m和XIB文件,然后在AppDelegate中我只需创建一个if条件,它决定将显示哪个视图控制器。
顺便说一句,我不在XIB上使用这些后缀,我根据自己的意愿命名它们

我的AppDelegate.h文件(它的一部分)

我的AppDelegate.m文件(它的一部分)

这绝对可以做到。只需将.h文件中的类和属性更改为视图控制器,您就可以开始了:)

编辑

我刚刚知道怎么做。正确的命名约定是iPhone和iPad。这与我上面发布的基本相同,唯一的变化是它将有相同的.h和.m文件,但不同的XIB

在AppDelegate.m文件中

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

此解决方案在使用您自己的自定义XIB时与故事板一起工作。它对视图重复使用相同的.h和.m文件:

  • ViewController.h
  • ViewController.m
  • ViewController.xib
  • ViewController~iPad.xib
在ViewController.m文件中添加:

- (id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self)
        {
            NSString* nibName = NSStringFromClass([self class]);
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
            {
                self = [super initWithNibName:nibName bundle:nil];
            }
            else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
            {
                self = [super initWithNibName:[nibName stringByAppendingString:@"~iPad"] bundle:nil];
            }
            return self;
        }
        return self;
    }

只需检查XIB是否设置了文件的所有者视图控制器自定义类名和视图出口

它确实对我有用。。。奇怪。但是这个应用程序真的是通用的吗?它是全屏运行吗?是的,它是全屏运行的。项目设置和目标设置中的设备系列都是“iPhone/iPad”。您使用两种不同的后缀还是使用哪种其他方式?Controller~ipad.xib和Controller~iphone.xib,然后在代码中我只调用[[Controller alloc]initWithNibName:@“Controller”bundle:nil];还是不走运!有没有办法用后缀来记录视图实际加载的xib,以确认它是~iphone版本还是~ipad版本?不知道,但这很奇怪。遗憾的是,我对两个xib都使用了一个类,那么如何解决这个问题呢?另外,我没有用于连接IBOutlets的mainWindow.xib,我只是以编程方式连接它。哦,我明白了!所以它不是~iphone.xib和~ipad.xib,而是_iphone.xib和_ipad.xib?是的,代码必须与我上面发布的代码相同(编辑标题下的代码)。遗憾的是,它不起作用。首先我有两个问题:1。我还应该做NSBundle mainBundle吗?2.我应该在这些条件语句中执行自动释放吗?这也是我遇到的崩溃:**由于未捕获的异常“nsInternalInconsistencException”而终止应用程序,原因是:“无法在捆绑包中加载NIB:我最终解决了所有问题,这与我的XIB在构建过程中没有正确编译有关,我必须对项目进行重新清理,现在它工作得很好,谢谢你的帮助和信息!
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
- (id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self)
        {
            NSString* nibName = NSStringFromClass([self class]);
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
            {
                self = [super initWithNibName:nibName bundle:nil];
            }
            else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
            {
                self = [super initWithNibName:[nibName stringByAppendingString:@"~iPad"] bundle:nil];
            }
            return self;
        }
        return self;
    }