根据应用程序运行的设备,从不同的 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 文件中有设置:NSMainNibFileNSMainNibFile~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的主要内容,如果未能解决你的问题,请参考以下文章

从 Xib 加载原型单元

在 XIB 中查看未针对不同设备调整大小

Xib 适用于不同的 iOS 设备/模拟器?

XIB 和模拟器/iOS 设备中元素的不同位置

如何为 iOS 应用程序的不同设备设置不同的启动文件(xib,而不是启动图像)

应用程序在设备上运行时 XIB 文件格式错误