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

Dan*_*ark 8 objective-c uikit app-store ios

由于UIBarButtonItem不是子类UIView,因此不可能像它那样获得正常的特征frame.

一种方法是 [barButtonItem valueForKey:@"view"]

这非常有效,并允许您将GestureRecognizer(例如)添加到底层UIView.

但是,这是私有UIKitAPI违规吗?

Far*_*ler 16

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

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

如果可能出现问题,您必须将方法包装起来@try { ... } @catch,以便拦截KVC可能在较新的iOS版本中失败.


Dan*_*ark 9

"这不是私人"的五个证据

  • 这是您可以通过其他方式获得的财产.试试这个,其中一个观点实际上就是问题的_view伊瓦尔UIBarButtonItem.这表明访问UIView它本身并不是禁止的,尽管KVO方式可能有问题(但我对此表示怀疑).

      NSArray *array = self.toolBar.subviews;
      for (UIView *view in array) {
          view.backgroundColor = UIColor.greenColor;
      }
    
    Run Code Online (Sandbox Code Playgroud)
  • 他们实际上触发了这个属性的KVO.ivars不必触发KVO API,对吗?

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

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

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

  • 多么永恒的答案.可能仍适用于iOS 9. (3认同)