适用于iPad的通用应用无法加载iPad .xib文件?

时间:2012-03-17 21:37:55

标签: ios ipad xib universal

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

我用@ iphone.xib的后缀命名我的iPhone xibs,然后用.xib留下我的iPad。我读过这样做是因为有人说这对他们有用,但就我而言,它对我不起作用!

即使我为不同的.xib文件执行了~ipi.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;
}

2 个答案:

答案 0 :(得分:4)

在我的应用中,我这样做。我为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;
}

答案 1 :(得分:0)

此解决方案在使用您自己的自定义xib时与Storyboard一起使用。它重复使用相同的.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是否设置了文件的所有者视图控制器自定义类名称和视图插座设置。