2011-04-08 84 views
3

所以我正在编写一个应用程序,我希望它是通用的。当我创建项目时,我创建了一个通用应用程序。我写了所有的iPhone代码,并拥有10个课程。现在我想创建iPad版本。我不希望基于完全相同的代码拥有两组类,而是希望根据设备类型加载不同的Nib。不同设备的不同笔尖

我尝试在应用程序委托中使用BOOL并且遇到了麻烦。我尝试了mainViewController类中的设备检查(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil我根据设备类型返回了不同的笔尖。但我只能得到iphone版本或空白的笔尖。预先感谢您的帮助。

回答

0

我想出如何:

在Interface Builder

,使用文件 - >创建iPad版

然后保存文件,并将其添加到项目中。然后在alloc时,初始化每个viewController,检查是否为UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad,否则它是一个iPhone或iPod Touch。在初始保存后,我无法对其进行编辑,但它起作用。

0

我有这个问题,我通过自定义UIViewController的方法来解决它。

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil 
{ 
    // See below for definition of "LWEUniversalAppHelpers fileNamed:" 
    NSString *universalNibName = [LWEUniversalAppHelpers fileNamed:nibNameOrNil]; 
    if ((self = [super initWithNibName:universalNibName bundle:nibBundleOrNil])) 
    { 
    // Custom initialization 
    } 
    return self; 
} 

LWEUniversalAppHelpers是一个辅助类我公司已致函确定该设备是一台iPad或没有。这是public on GitHub,但基本的概念是使用视网膜的“@ 2x”政策,但我们使用“@HD”。

+0

看起来很酷,但当iPad 3或4具有视网膜显示,然后你被@ HD @ 2x卡住时会发生什么。这会是一团糟。 – Moshe 2011-04-11 00:28:35

1

Apple现在为您提供了一个默认机制,以便在同一个项目中分离iPhone和iPad之间的代码。

在Xcode 4中,当您创建新的“基于窗口的应用程序”或“基于视图的应用程序”时,您可以选择选择“设备系列”。如果您为此选项选择“Universal”,则Xcode将创建3个应用程序代理。

首先,主应用程序的委托:

YourAppNameAppDelegate : NSObject <UIApplicationDelegate> 

和另外两个应用程序代表(放置在不同的组)是“YourAppNameAppDelegate”的子类:

YourAppNameAppDelegate_iPhone : YourAppNameAppDelegate 
YourAppNameAppDelegate_iPad : YourAppNameAppDelegate 

当你运行你的应用程序无论是iPhone还是iPad模拟器(或设备),应用程序都会根据所选设备自动使用_iPhone或_iPad应用程序委托子类。

如果重写应用中:didFinishLaunchingWithOptions:在每个子类中的方法,你会看到这样的工作:

// In YourAppNameAppDelegate_iPhone.m 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"iPhone App Delegate"); 
    return [super application:application didFinishLaunchingWithOptions:launchOptions]; 
} 

// In YourAppNameAppDelegate_iPad.m 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"iPad App Delegate"); 
    return [super application:application didFinishLaunchingWithOptions:launchOptions]; 
} 

这给你一个起点,在那里你可以根据设备的用户是对改变程序流程。例如通过实例化主视图控制器的其中一个子类(如下所述)。

当您将新的视图控制器添加到您的项目中时,您应该通过创建一个通用控制器超类以及iPhone/iPad特定的子类继续此范例。请注意,通用超类不应该有与它们相关联的nib文件,而子类应该各自拥有自己的独立笔尖。

这样你就可以在三个类之间分解代码,在超类中保留与平台无关的东西 - 例如一些属性,方法,IBOutlets和IBActions - 并将特定于平台的实现放入子类中。

+0

escept,我正在使用xcode 3 – Andrew 2011-04-10 23:42:28

+0

任何原因你不转换?它是免费的.. [developer.apple.com/xcode](http://developer.apple.com/xcode/) – 2011-04-11 23:11:01

+0

是Xcode 4公开发布还是在测试版?我看到它处于测试阶段,看着所有主要的变化,只是认为我会坚持我失败的事情。我不经常查看dev.apple.com – Andrew 2011-04-11 23:19:32

6

根据文档(资源编程指南),您可以使用以下名称约定: myNibName〜ipad.xib和myNibName〜iphone.xib因此每个文件只能在受支持的设备上打开。你甚至不需要设置不同的appDelegates :)

--- from doc --- 在iOS 4.0和更高版本中,可以将单个资源文件标记为仅在特定类型的设备上可用。此功能简化了您必须为通用应用程序编写的代码。而不是创建单独的代码路径来为iPhone加载一个版本的资源文件,并为iPad加载不同版本的文件,您可以让包加载例程选择正确的文件。你所要做的就是适当地命名你的资源文件。

要将资源文件与特定设备相关联,请将自定义修饰符字符串添加到其文件名。包含此修饰符字符串将生成以下格式的文件名:

该字符串表示资源文件的原始名称。它也代表从代码访问文件时使用的名称。同样,该字符串是用于标识文件类型的标准文件扩展名。该字符串是区分大小写的字符串,可以是以下值之一:

〜ipad - 资源只能在iPad设备上加载。 〜iphone - 资源只能在iPhone或iPod touch设备上加载。

+1

'〜ipad'和'〜iphone'中的小写字母'p'对我来说是错误的,但这确实是Apple所描述的。链接到文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/Introduction/Introduction.html%23//apple_ref/doc/uid/10000051i-CH1-SW2 – 2012-03-20 10:57:37

+3

小写' p'非常重要。 〜iPad将工作模拟器,但不会加载在真实的设备上。某些版本的XCode会创建〜iPad文件(带有大写字母“P”),这些文件具有误导性并且不起作用。 – 2012-03-26 20:51:57

+0

^^感谢Johan和Woj。我对自己很好奇。 – Cyprus106 2014-04-30 02:34:40