Verwenden von 'valueForKey' für den Zugriff auf die Ansicht in UIBarButtonItem, private API-Verletzung?

8

Da UIBarButtonItem die Klasse UIView nicht ableitet, ist es unmöglich, die normalen Eigenschaften wie frame zu erhalten.

Eine Möglichkeit, dies zu tun, ist [barButtonItem valueForKey:@"view"]

Dies funktioniert perfekt und Sie können einen GestureRecognizer (zum Beispiel) zum zugrunde liegenden UIView hinzufügen.

Ist dies jedoch eine private UIKit API-Verletzung?

    
Dan Rosenstark 12.08.2012, 16:01
quelle

2 Antworten

14

Dies ist nicht privat in Bezug auf die sofortige Ablehnung bei der Validierung, aber es ist privat genug, um als fragil angesehen zu werden (das heißt, eine neue iOS-Version kann Ihre bestehende App im App-Store, der den Code verwendet, beschädigen).

Ich kann sagen, dass ein ähnlicher Code (das den iView BackgroundView von UIToolbar via KVC holt) die Validierung des Appstores bestanden hat und in der Produktion verwendet wird.

Im Falle von möglichen schlimmen Dingen müssen Sie die Methode in @try { ... } @catch umbrechen, damit Sie KVC abfangen können, was möglicherweise in einer neueren iOS-Version fehlschlägt.

    
Farcaller 12.08.2012, 16:37
quelle
7

Fünf Beweise für "Es ist nicht privat"

  • Es ist eine Eigenschaft, die Sie auf andere Weise erreichen können. Versuchen Sie es, und eine dieser Ansichten ist in der Tat die _view ivar der UIBarButtonItem in Frage. Dies zeigt an, dass der Zugriff auf dieses UIView nicht selbst verboten ist, obwohl der KVO-Weg möglicherweise fraglich ist (aber ich bezweifle es).

    %Vor%
  • Sie lösen die KVO für diese Eigenschaft aus. Ivars müssen die KVO-API nicht auslösen, oder?

  • @Farcaller erwähnt einen ähnlichen Fall, der im App Store zum Verkauf steht. Da er / sie innerhalb der ersten 20 Minuten der Frage, die da oben ist, geantwortet hat, ist es vernünftig (aber nicht sicher!) Anzunehmen, dass es im App Store Tausende von Apps gibt, die dies tun.

  • Diese UIView wird bei jedem Drücken der Schaltfläche ausgeblendet, sodass Sie beispielsweise nicht einfach einen Gestenerkennungserkenner darauf setzen können. Sie können jedoch immer den gleichen Gestenerkenner einstellen, wenn view ersetzt wird. Für mich ist dies eher ein Beweis dafür, dass es sich nicht um eine private API-Sache handelt, sondern Sie müssen sehr vorsichtig sein, wenn Sie es verwenden (und KVO verwenden, um sicherzustellen, dass Sie das Neueste haben).

  • Meine App steht im App Store zum Verkauf und macht das.

Dan Rosenstark 12.08.2012 17:58
quelle

Tags und Links