首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写针对iOS7 6 Base编译的iOS代码

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

Stack Overflow用户
提问于 2013-08-18 21:20:22
回答 5查看 10K关注 0票数 8

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

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

代码语言:javascript
复制
// 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;

(为避免破坏NDA而混淆)

XCode错误:

在类型为“fooForExtendedLayout*”的对象上找不到属性“UIViewController” 未声明标识符“UIFooEdgeLeft”的使用 未声明标识符“UIFooEdgeRight”的使用 在类型为“bottomLayoutFoo*”的对象上找不到属性“UIViewController”

注释掉这段新代码将是件痛苦的事。什么是正确的方式来重写它以兼容新旧的Base,并且现在提交它(通过XCode 4和构建在iOS 6 SDK之上)是否有任何类型的应用商店拒绝的风险?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-18 21:31:34

我建议等到iOS 7准备好提交您的更新。

然而,它们是解决这一问题的方法。

在类型为“fooForExtendedLayout*”的对象上找不到属性“UIViewController”

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

代码语言:javascript
复制
[ self performSelector: NSSelectorFromString( "setFooForExtendedLayout:" ) withObject: ( id )xxx ];

@selector()不能使用,因为您需要一个带有iOS 6 SDK的iOS 7选择器。

因此使用了NSSelectorFromString

withObject参数是为对象设置的,顾名思义。但是,由于对象是指针,并且由于您的方法接受枚举值,所以实际上可以使用强制转换传递它,而不存在任何问题。

未声明标识符“UIFooEdgeLeft”的使用 未声明标识符“UIFooEdgeRight”的使用

现在关于你的枚举值,没有这样的诡计。

唯一的方法是声明它们,其值与iOS 7 SDK中的值相同,并祈祷在官方发布之前不会改变。

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

票数 7
EN

Stack Overflow用户

发布于 2013-10-31 10:51:04

下面是在recommended way 6和7 SDK上编译代码的iOS:

代码语言:javascript
复制
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight;
#endif
票数 7
EN

Stack Overflow用户

发布于 2013-08-27 08:53:55

你可以用:

代码语言:javascript
复制
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endif
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18303786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档