Использование `valueForKey` для доступа к представлению в UIBarButtonItem, нарушение частного API?

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

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

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

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

 Joe13 авг. 2012 г., 16:49
Смотрите этот ответstackoverflow.com/a/5066899/418715 для получения дополнительной информации.
 Dan Rosenstark13 авг. 2012 г., 22:55
Привет @ Джо, да, я видел это, но не знал, что с этим делать. Теперь я думаю, что все будет хорошо. Причина, по которой они KVC, заключается в том, что вид сильно поменялся местами.

Ответы на вопрос(2)

Решение Вопроса

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

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

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

 Dan Rosenstark30 авг. 2012 г., 20:47
Приложение было одобрено с этим кодом практически в каждом уголке приложения. Я имею в виду, с точки зрения исполнения, код только в одном месте :) Так что спасибо еще раз!
 31 мая 2013 г., 05:53
@farcaller, что ты думаешь об использованииsetValue:forKey: на "частном" апи? Я хочу установить_customRightViews свойство ноль дляUINavigationItem.
 02 июл. 2013 г., 16:32
Мой ответ в основном применим к любому "частному лицу" Ивар.
 Dan Rosenstark12 авг. 2012 г., 19:48
Спасибо, отличный ответ, удачи здесь на SO.

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.

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

Ваш ответ на вопрос