0

我有一个同时支持 iOS 5 和 iOS 6 的应用程序。在一个类中,我需要在本地声明一些 NSLayoutConstraint 指针,它们仅适用于 iOS 6。我只将它们用于 iOS 6 布局,因为对于 iOS 5,我会自动调整布局大小。此类用于 iOS 5 和 iOS 6。

有没有办法在类的头文件中声明一些 NSLayoutConstraint 指针,这样我在 iOS 5 下就不会出现异常?

我尝试过以下操作,但在我的实现文件中出现编译器错误,即未声明此约束:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0
NSLayoutConstraint *exampleConstraint;
#endif

非常感谢您的任何建议

利纳德

4

1 回答 1

1

#if是编译时预处理器指令,编译后无效。您的代码片段所做的只是在__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0为 true 时包含定义 - 因此,当您将最小值设置为 iOS 5 时,将永远不会包含此声明。

但是,您的问题的解决方案很简单 - 至少在此声明中什么也不做。iOS/OS X 使用弱链接,因此您可以针对仅在 iOS 6 中可用的框架/类型编译代码,并且如果您测试已加载的类型,代码将在 iOS 5 下成功加载和执行。您可以通过调用类型上的方法来测试类型是否已加载,如果未加载class类型,则会返回。nil

因此,在您的代码中,您首先将#if声明放在周围,然后使用的代码NSLayoutConstraint必须包含在条件中,该条件仅在类型存在时才执行。就像是:

NSLayoutConstraint *exampleConstraint;
...

BOOL haveNSLayoutConstraint = [NSLayoutConstraint class] != nil;
...

if( haveNSLayoutConstraint )
{
   ... exampleConstraint ...
}
于 2013-05-28T02:35:53.257 回答