根据应用程序运行的设备,从不同的 xib 初始化 rootViewController
Posted
技术标签:
【中文标题】根据应用程序运行的设备,从不同的 xib 初始化 rootViewController【英文标题】:initializing rootViewController from different xibs depending on the device the App runs on 【发布时间】:2011-01-17 17:33:40 【问题描述】:大家好, 我有以下问题: 我有一个 iPad 应用程序,现在我希望它也可以在 iPhone 上运行。 (我知道它应该反过来,但我不能改变它)。 所以现在我想通过使用来决定我需要哪个视图:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
// The device is an iPad running ios 3.2 or later.
else
// The device is an iPhone or iPod touch.
这适用于除 RootViewController 之外的所有视图。 无论我在哪里为 RootViewController 设置 xib,它总是显示我为 IPad-App 定义的那个。
这是我在 App-Delegate 中的代码:
viewController = [VoycerUniversalAppViewController sharedInstance];
UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.window addSubview:myNavigationController.view];
//[self.window addSubview:self.vcSplashScreen.view];
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
return YES;
这是我的 [VoycerUniversalAppViewController sharedInstance] 中的代码:
+ (VoycerUniversalAppViewController*) sharedInstance
@synchronized(self)
if(sharedInstance == nil)
// only allocate here - assignment is done in the alloc method
if (![AppState sharedInstance].loggedIn)
[AppState sharedInstance ].loggedIn = FALSE;
return sharedInstance;
+ (id) allocWithZone:(NSZone*)zone
@synchronized(self)
if(sharedInstance == nil)
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
// The device is an iPad running iOS 3.2 or later.
NSLog(@"The device is an iPad running iOS 3.2 or later.");
sharedInstance = [[super allocWithZone:zone] initWithNibName:@"VoycerUniversalAppViewController" bundle:nil];
else
// The device is an iPhone or iPod touch.
NSLog(@"The device is an iPhone or iPod touch.");
sharedInstance = [[super allocWithZone:zone] initWithNibName:@"VoycerUniversalAppIPhoneViewController" bundle:nil];
// allocate and assign instance variable on first allocation
return sharedInstance;
return nil;
如果我错过了一些设置或其他东西,我几乎到处找,但我找不到任何东西。 你们有谁知道,为什么不断加载 VoycerUnversalAppViewController 而不是另一个? 两个 Xib 都链接到同一个类。 如果解决方案是一个非常简单且显而易见的解决方案,请不要怪我,我对 xcode、IB 和 Objective-c 真的很陌生(我现在在 Objective-c 中编码了 1 1/2 个月)。
提前谢谢。 特立独行。
【问题讨论】:
【参考方案1】:对于主 NIB,info.plist
文件中有设置:NSMainNibFile
和 NSMainNibFile~ipad
。
在 NIB 文件中,您可以创建应用程序委托并设置导航控制器。
【讨论】:
当我开始项目时,我创建了一个 MainWindow.xib,其中包含我的委托和 ViewController,因为我的一位同事告诉我这样做。如果我在 MainWindow.xib 中为适当的视图控制器更改 xib 文件,它对视图没有影响。它仍然显示错误的。因为我只有一个用于 iPad 和 iPhone 的 MainWindow.xib,所以我将 info.plist 中的 NSMainNibFiles 都设置为 MainWindow。或者我应该为 iPhone 制作一个全新的 MainWindow.xib?但是,即使它们现在不起作用,也要感谢这些提示。这对我来说是有用的信息。 :) 是的,创建两个 NIB 并将它们添加到 info.plist。它应该可以工作。 很遗憾没有。我创建了一个 IPhone_MainWindow.xib 并将其设置为 NSMainNibFile~ipad,但尽管它进入 else // 设备是 iPhone 或 iPod touch。 NSLog(@"设备是 iPhone 或 iPod touch。"); sharedInstance = [[super allocWithZone:zone] initWithNibName:@"VoycerUniversalAppIPhoneViewController" bundle:nil];它不会用正确的笔尖显示我的视图。如何将 iPhone 视图的 xib 与 mainWindow.xib 连接?我只能设置 ViewController 类和委托,不能设置 xib。 好的,现在我得到了我的 iPhone_MainWindow.xib 来为我的 RootViewController 加载正确的 xib 文件。我只是忘记在 IPhone_MainWindow.xib 中为 ViewController 设置正确的 NibFile。谢谢帮助 如果你的意思是我应该点击钩子,那么我已经做到了:)。以上是关于根据应用程序运行的设备,从不同的 xib 初始化 rootViewController的主要内容,如果未能解决你的问题,请参考以下文章