使用`valueForKey`来访问UIBarButtonItem中的视图,私有API违规?

时间:2012-08-12 16:01:08

标签: objective-c ios uikit app-store

由于UIBarButtonItem不是UIView的子类,因此无法像frame那样获得正常的特征。

执行此操作的一种方法是[barButtonItem valueForKey:@"view"]

这非常有效,并且允许您将GestureRecognizer(例如)添加到基础UIView

但是,这是私有的UIKit API违规吗?

2 个答案:

答案 0 :(得分:14)

在验证时立即拒绝这不是私密的,但它足够私密,被认为是脆弱的(也就是说,新的iOS版本可能会破坏使用该代码的应用商店中的现有应用。)

我可以说,类似的代码(通过KVC获取UIToolbar的backgroundView ivar)已通过应用商店验证并正在生产中使用。

如果可能有不好的事情,你必须将方法包装在@try { ... } @catch中,以便拦截KVC可能在较新的iOS版本中失败。

答案 1 :(得分:7)

“它不是私人”的五个证据

  • 这是一个你可以通过其他方式获得的属性。试试这个,其中一个观点实际上是_view的{​​{1}} ivar。这表明访问此UIBarButtonItem本身并不被禁止,尽管KVO方式可能有问题(但我对此表示怀疑)。

    UIView
  • 他们实际上触发了此属性的KVO。 ivars不必触发KVO API,对吗?

  • @Farcaller提到了一个类似的案例,可在App Store中出售。由于他/她在问题的前20分钟内回答,因此假设App Store中可能有数千个应用程序执行此操作是合理的(但不安全!)。

  • 每次按下按钮时,此UIView都会被取消,因此您不能仅仅在其上设置手势识别器并完成。但是,每次 NSArray *array = self.toolBar.subviews; for (UIView *view in array) { view.backgroundColor = UIColor.greenColor; } 被替换时,您都可以继续设置相同的手势识别器。对我来说,这实际上更多的证据表明它不是私有的API,而是在使用它时必须非常小心(并使用KVO来确保你拥有最新的)。

  • 我的应用程序在App Store中出售并执行此操作。