使用`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中销售,并执行此操作。