我们现在有一款iOS应用正在销售,我们正在使用相同的代码库在XCode 5 DP上开发iOS 7版本。
我们现在确实需要为现有的iOS 5/6客户发布更新,但是当然,当我们将项目重新加载到XCode 4中时,它会抱怨没有存在的属性,因为Base后来变成了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;(为避免破坏NDA而混淆)
XCode错误:
在类型为“fooForExtendedLayout*”的对象上找不到属性“UIViewController” 未声明标识符“UIFooEdgeLeft”的使用 未声明标识符“UIFooEdgeRight”的使用 在类型为“bottomLayoutFoo*”的对象上找不到属性“UIViewController”
注释掉这段新代码将是件痛苦的事。什么是正确的方式来重写它以兼容新旧的Base,并且现在提交它(通过XCode 4和构建在iOS 6 SDK之上)是否有任何类型的应用商店拒绝的风险?
发布于 2013-08-18 21:31:34
我建议等到iOS 7准备好提交您的更新。
然而,它们是解决这一问题的方法。
在类型为“fooForExtendedLayout*”的对象上找不到属性“UIViewController”
由于属性只是一种语法糖,修复这种错误的简单方法是使用选择器调用方法(setter):
[ self performSelector: NSSelectorFromString( "setFooForExtendedLayout:" ) withObject: ( id )xxx ];@selector()不能使用,因为您需要一个带有iOS 6 SDK的iOS 7选择器。
因此使用了NSSelectorFromString。
withObject参数是为对象设置的,顾名思义。但是,由于对象是指针,并且由于您的方法接受枚举值,所以实际上可以使用强制转换传递它,而不存在任何问题。
未声明标识符“UIFooEdgeLeft”的使用 未声明标识符“UIFooEdgeRight”的使用
现在关于你的枚举值,没有这样的诡计。
唯一的方法是声明它们,其值与iOS 7 SDK中的值相同,并祈祷在官方发布之前不会改变。
所以现在由你决定..。就我个人而言,我会等。
发布于 2013-10-31 10:51:04
下面是在recommended way 6和7 SDK上编译代码的iOS:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight;
#endif发布于 2013-08-27 08:53:55
你可以用:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
#endifhttps://stackoverflow.com/questions/18303786
复制相似问题