编写针对iOS 6 Base SDK编译的iOS7代码

Car*_*s P 7 sdk xcode ios6

我们现在有一个iOS应用程序在售,我们正在使用相同的代码库在XCode 5 DP上开发iOS 7版本.

我们现在真的需要为现有的iOS 5/6客户发布更新,当然,当我们将项目重新加载到XCode 4时,它会抱怨不存在的属性,因为Base SDK然后变成iOS6而不是7:

// Only run this bit on iOS 7
if ([self respondsToSelector:@selector(setFooForExtendedLayout:)])
{
    self.fooForExtendedLayout = UIFooEdgeLeft | UIFooEdgeRight;
}

float bottomOffset = 0;
// Only run this bit on iOS 7, else leave bottomOffset as 0
if ([self.hostController respondsToSelector:@selector(bottomLayoutFoo)])
    bottomOffset = self.hostController.bottomLayoutFoo.length;
Run Code Online (Sandbox Code Playgroud)

(混淆以避免破坏NDA)

XCode错误:

在'UIViewController*'类型的对象上找不到属性'fooForExtendedLayout'

使用未声明的标识符'UIFooEdgeLeft'

使用未声明的标识符'UIFooEdgeRight'

在'UIViewController*'类型的对象上找不到属性'bottomLayoutFoo'

评论这个新代码会很痛苦.重新编写它以便与旧的和新的Base SDK兼容的正确方法是什么,并且现在提交它(通过XCode 4并针对iOS 6 SDK构建)会冒任何类型的App Store拒绝风险?

0xc*_*ced 7

以下是在iOS 6和7 SDK上编译代码的推荐方法:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight;
#endif
Run Code Online (Sandbox Code Playgroud)


Mac*_*ade 6

我建议等到iOS 7准备好提交您的更新.
但是,它们是解决问题的方法.

在'UIViewController*'类型的对象上找不到属性'fooForExtendedLayout'

由于属性只是一种语法糖,修复此类错误的简单方法是使用选择器来调用方法(setter):

[ self performSelector: NSSelectorFromString( "setFooForExtendedLayout:" ) withObject: ( id )xxx ];
Run Code Online (Sandbox Code Playgroud)

@selector()因为您要求使用iOS 6 SDK的iOS 7选择器,所以无法使用.
因此使用NSSelectorFromString.
withObject参数为对象进行的,因为它的名字暗示.但是由于对象是指针,并且您的方法采用枚举值,因此您可以使用强制转换实际传递它.

使用未声明的标识符'UIFooEdgeLeft'
使用未声明的标识符'UIFooEdgeRight'

现在关于你的枚举值,没有这样的技巧.
唯一的方法是使用与iOS 7 SDK中相同的值声明它们,并祈祷它在正式发布之前不会更改.

所以现在由你决定......就个人而言,我会等.


小智 5

你可以使用:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif
Run Code Online (Sandbox Code Playgroud)