Вопрос по app-store, objective-c, uikit, ios – Использование `valueForKey` для доступа к представлению в UIBarButtonItem, нарушение частного API?

8

посколькуUIBarButtonItem не подклассUIViewневозможно получить нормальные характеристики, такие какframe.

Один из способов сделать это[barButtonItem valueForKey:@"view"]

Это прекрасно работает и позволяет вам добавить GestureRecognizer (например) к базовомуUIView.

Тем не менее, это частныйUIKit Нарушение API?

Привет @ Джо, да, я видел это, но не знал, что с этим делать. Теперь я думаю, что все будет хорошо. Причина, по которой они KVC, заключается в том, что вид сильно поменялся местами. Dan Rosenstark
Смотрите этот ответstackoverflow.com/a/5066899/418715 для получения дополнительной информации. Joe

Ваш Ответ

2   ответа
7

Five Pieces of Evidence for "It's Not Private"

It's a property that you can get to in other ways. Try this and one of those views is, in fact, the _view ivar of the UIBarButtonItem in question. This indicates that access to this UIView is not prohibited itself, though the KVO way in might be questionable (but I doubt it).

  NSArray *array = self.toolBar.subviews;
  for (UIView *view in array) {
      view.backgroundColor = UIColor.greenColor;
  }

They actually trigger the KVO for this property. ivars do not have to trigger the KVO API, right?

@Farcaller mentions a similar case which is for sale in the App Store. Since he/she answered within the first 20 minutes of the question being up there, it's reasonable (but not safe!) to assume that there might be thousands of apps in the App Store that do this.

This UIView gets subbed out each time the button is pressed, so you cannot just, for example, set a gesture recognizer on it and be done. You can, however, keep setting the same gesture recognizer every time the view gets replaced. To me, this is actually more evidence that it's not a private API thing, but rather you have to be very careful when using it (and use KVO to make sure you have the latest one).

My app is for sale in the App Store and does this.

Какой вечный ответ. Вероятно, все еще применимо к iOS 9.
Я думаю, что это разница междуprivate («Не используйте его, мы должны быть свободны, чтобы изменить эту деталь внутренней реализации в любое время») иundocumented («Используйте на свой страх и риск, мы не несем ответственности»).
14

Это не является частным с точки зрения немедленного отклонения после проверки, но является достаточно частным, чтобы считаться хрупким (то есть новая версия iOS может сломать ваше существующее приложение в магазине приложений, использующем код).

Могу сказать, что подобный код (извлекающий фоновый вид ivar из UIToolbar через KVC) прошел проверку магазина приложений и используется в производстве.

В случае возможных плохих вещей, вы должны обернуть метод в@try { ... } @catch, так что вы перехватываете KVC, возможно, сбой в новой версии iOS.

Спасибо, отличный ответ, удачи здесь на SO. Dan Rosenstark
Мой ответ в основном применим к любому "частному лицу" Ивар.
@farcaller, что ты думаешь об использованииsetValue:forKey: на "частном" апи? Я хочу установить_customRightViews свойство ноль дляUINavigationItem.
Приложение было одобрено с этим кодом практически в каждом уголке приложения. Я имею в виду, с точки зрения исполнения, код только в одном месте :) Так что спасибо еще раз! Dan Rosenstark

Похожие вопросы