【问题标题】:Universal app for iPad not loading iPad .xib files?iPad 通用应用程序不加载 iPad .xib 文件?
【发布时间】:2012-04-02 23:34:00
【问题描述】:

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

我已将我的 iPhone xib 命名为后缀 ~iphone.xib,而我将 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;
}

【问题讨论】:

  • 它确实对我有用......奇怪。但这款应用真的通用吗?它是否以“全屏”模式运行?
  • 是的,它确实全屏运行。项目设置和目标设置中的设备系列均为“iPhone/iPad”。您是使用两个不同的后缀还是使用其他哪种方式?
  • Controller~ipad.xib 和 Controller~iphone.xib 然后在代码中我只调用 [[Controller alloc] initWithNibName:@"Controller" bundle:nil];
  • 还是没有运气!有什么方法可以 NSLog 视图实际加载的带有后缀的 xib 以确认它是 ~iphone 版本还是 ~ipad 版本?
  • 不知道,但这很奇怪。

标签: ios ipad xib universal


【解决方案1】:

在我的应用程序中,我是这样做的。我为 iPad 视图创建单独的 .h、.m 和 XIB 文件,然后在 AppDelegate 中我简单地创建一个 if 条件,它决定它将显示哪个视图控制器。
顺便提一句。我不在 XIB 上使用这些后缀,我将它们命名为我想要的名称。

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

 @class FirstViewController;
 @class FirstIpadViewController;    
 .......
 .......
 @property (nonatomic, retain) IBOutlet FirstViewController *viewController;
 @property (nonatomic, retain) IBOutlet FirstIpadViewController *ipadViewController;

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

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
} else {
    self.window.rootViewController = self.ipadViewController;
    [self.window makeKeyAndVisible];
}

这绝对应该这样做。只需将 .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 都使用了一个类,那么我该如何解决这个问题呢?我也没有用于连接 IBOutlets 的 mainWindow.xib,我只是以编程方式连接它。
  • 哦,我明白了!所以不是~iphone.xib 和~ipad.xib 而是_iPhone.xib 和_iPad.xib?
  • 是的,代码必须与我上面发布的相同(编辑标题下的代码)。
  • 遗憾的是它不起作用。首先我有两个问题: 1. 我还应该做 NSBundle mainBundle 吗? 2. 我应该在这些条件语句中进行自动释放吗?这也是我得到的崩溃:***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在包中加载NIB:
  • 我最终修复了所有问题,这与我的 xib 在构建过程中没有正确编译有关,我必须重新清理项目,现在它可以完美运行,感谢帮助和信息!
【解决方案2】:

此解决方案适用于 Storyboard,同时使用您自己的自定义 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 是否设置了文件所有者视图控制器自定义类名称和视图出口设置。

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2012-01-15
    • 2013-08-05
    • 2011-09-07
    • 2011-09-13
    • 2012-04-17
    • 2011-03-14
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多