Iphone 在Objective-C和iOS中纳入项目范围定义的最佳实践

Iphone 在Objective-C和iOS中纳入项目范围定义的最佳实践,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,在我的例子中,我有一个高度定制的iPhone应用程序,具有所有自定义视图。我想利用iPhone5的屏幕尺寸,但我的视图需要精确的布局,在视图上设置autoresizingMask是不够的 我希望在每个源文件中都有某种项目范围的定义标志,我需要在运行时设置这个定义/标志。在我的特定情况下,我可能会导入一些头文件定义,如下所示: if ( IS_IPHONE_5 ) { /* Set appropriate frames for the additional screen space */

在我的例子中,我有一个高度定制的iPhone应用程序,具有所有自定义视图。我想利用iPhone5的屏幕尺寸,但我的视图需要精确的布局,在视图上设置autoresizingMask是不够的

我希望在每个源文件中都有某种项目范围的定义标志,我需要在运行时设置这个定义/标志。在我的特定情况下,我可能会导入一些头文件定义,如下所示:

if ( IS_IPHONE_5 ) {

/* 
   Set appropriate frames for the additional screen space
*/
}

else {

/* 
  Set views otherwise
*/
}
这个问题并不是完全主观的——它可以适用于任何希望设置和检索项目范围定义的人。也许另一种情况可能是颜色主题或可以在设置中更改的内容

在程序执行时,如何设置这些定义,以及如何在源文件中合并它们


谢谢。

只需将宏放入应用程序的
APPNAME\u prefix.pch
文件即可:

#define IS_IPHONE_5 ([[UIScreen mainScreen]bounds].size.height == 568)
应用程序中的每个文件都可以使用它

作为另一种建议,我认为我的首选是在
UIDevice
上添加一个类别,也许还可以添加一个宏以方便起见,然后只让需要它的对象(即负责布局的视图和控制器层中的对象)导入它,以避免将模型耦合到
UIKit

例如,
UIDevice+iPhone5.h

#define IS_IPHONE_5 [[UIDevice currentDevice] isIPhone5]

@interace UIDevice (iPhone5)

- (BOOL)isIPhone5;

@end
UIDevice+iPhone5.m

@implementation UIDevice(iPhone5Checking)

- (BOOL)isIPhone5
{
     return ([[UIScreen mainScreen]bounds].size.height == 568); //or however else you want to check
}

@end

哪一个最适合你的需要。希望这有帮助

为了澄清-您想知道1)如何在运行时检查设备是否为iPhone 5,以及2)如何使执行此检查的函数/方法/宏对所有源文件可见。对吗?我知道我可以通过if([[UIScreen mainScreen]bounds].size.height==1136.0f)检查设备是否是iPhone 5。那么,如何使函数/方法/宏在所有源文件中可见呢。谢谢,卡尔。这是一个很好的回答,卡尔,谢谢。总而言之,您的解决方案回答了我的直接问题,但是对于一些可以更改的定义,比如我的颜色主题的理论示例,又如何呢?在这种情况下,每个控制器都需要查看当前设置的颜色主题。没有夹钳。想法?@Monticello谢谢你!很高兴你发现它有用。我认为这种方法可以推广到许多其他情况。找到或创建最适合您分配给它的职责的对象。也许在您的颜色示例中,视图控制器意识到一个主题可能没有意义,因为您提供了一个带有许多方便方法的
UIColor
类别,并且每个控制器都知道什么颜色名称和什么颜色。e、 g.提供一个
+headerBackgroundColor
方法,该方法将根据当前颜色主题返回不同的
UIColor
实例。继续…我是只导入最小值的大力支持者,所以我只导入视图和控制器中负责为UI元素分配颜色的文件。但是,如果您想要全局可见性,请再次将类别导入放到
.pch
文件中。为方便分类标题,还提供了一些
#define
s,例如
#define header\u BACKGROUND\u COLOR[UIColor headerBackgroundColor]
。这些都有意义吗?一般原则是将合理的、项目范围内的行为和责任分配给适当的类(cont'd)…您是自己创建这些类,还是将它们作为类别添加到框架类中,取决于手头任务的性质。哦,还有另一个关于可见性的提示-如果您对所有应用程序的控制器都使用
UIViewController
的通用超类,那么如果您没有使用
.pch
,我会说将颜色导入放在超类标题中,以便子类使用。不管怎样,我希望这能给你一些关于更一般情况的指导。请让我知道我可以扩展更多。最后,你提到了颜色主题存储的一个限制,即不允许使用plist。我认为这更多的是由实现特性所涉及的任何类或类别来处理的实现细节。希望这一切对你有帮助!