使用`valueForKey`访问UIBarButtonItem中的视图,私有API违规?
由于UIBarButtonItem
不是UIView
子类,所以不可能像它的frame
那样得到正常的特征。
一种方法是[barButtonItem valueForKey:@"view"]
这完美的工作,并允许你添加一个GestureRecognizer(例如)到底层的UIView
。
但是,这是一个私人的UIKit
API违规?
这在validation时立即被拒绝是不私密的,但是它被认为是脆弱的(也就是说,新的iOS版本可能会破坏正在使用代码的app store中的现有应用)。
我可以说,一个类似的代码(通过KVC获取UIToolbar的backgroundView ivar)已经通过app storevalidation,并正在使用的生产。
万一有可能出现问题,您必须将方法封装在@try { ... } @catch
,以便在更新的iOS版本中拦截KVC可能失败。
“不是私人”的五件证据
-
这是一个属性,你可以通过其他方式获得。 试试这个,其中的一个意见实际上是
_view
ivar。 这表明访问这个UIView
本身并不被禁止,尽pipeKVO的方式可能是有问题的(但我怀疑它)。NSArray *array = self.toolBar.subviews; for (UIView *view in array) { view.backgroundColor = UIColor.greenColor; }
-
他们实际上触发了这个属性的KVO。 ivars不必触发KVO API,对吧?
-
@Farcaller提到了一个在App Store中出售的类似案例。 由于他/她在问题出现的前20分钟内回答,所以假设在App Store中可能有成千上万个应用程序这样做是合理的(但不是安全的)。
-
这个UIView在每次按下button的时候都被取消了,所以你不能仅仅为了设置一个手势识别器而完成。 但是,您可以每次更换
view
始终设置相同的手势识别器。 对我来说,这实际上是更多的证据,这不是一个私人API的事情,而是你必须非常小心使用它(并使用KVO,以确保你有最新的)。 -
我的应用程序是在App Store中销售,并执行此操作。
- Appstore Failure在二进制文件中没有体系结构。 Lipo未能检测到软件包可执行文件中的任何体系结构。“在SoftwareAssets / SoftwareAsset
- 我的应用程序拒绝了一些问题
- 什么是“必须为iOS设备build立视网膜显示器”
- 如何使用.plist在App Store外部下载和安装.ipa
- 如果以前的构build正在等待审阅,可以将构build提交给app store进行testing吗?
- Xcode错误:“标识符为”com.xxx.xxx“的应用程序ID不可用。”
- 应用程序标识符权利值已更改?
- 是否可以在iTunes连接上创build一个最小testing应用程序条目?
- 如何在iOS中使用bzip2格式? 苹果告诉我,bzBuffToBuffDecompress是私有API