2012-08-12 5 views
8

Poiché UIBarButtonItem non ha sottoclasse UIView, è impossibile ottenere le normali caratteristiche come il suo frame.Utilizzo di `valueForKey` per accedere alla vista in UIBarButtonItem, violazione dell'API privata?

Un modo per farlo è [barButtonItem valueForKey:@"view"]

Questo funziona perfettamente, e consente di aggiungere un GestureRecognizer (per esempio) al sottostante UIView.

Tuttavia, si tratta di una violazione API privata UIKit?

+0

Vedere questa risposta http://stackoverflow.com/a/5066899/418715 per ulteriori informazioni. – Joe

+0

Ciao @Joe, sì, l'ho visto, ma non sapevo cosa farmene. Ora penso che andrà tutto bene. Il motivo per cui KVC è che la vista viene scambiata molto. –

risposta

14

Questo non è privato in termini di rifiuto immediato alla convalida, ma è abbastanza privato da essere considerato fragile (ovvero, la nuova versione iOS può interrompere l'app esistente nell'app store che sta utilizzando il codice).

Posso dire che un codice simile (che recuperava ivar backgroundView di UIToolbar tramite KVC) ha superato la convalida dell'app store e viene utilizzato nella produzione.

In caso di possibili problemi, è necessario eseguire il wrapping del metodo in @try { ... } @catch, in modo da intercettare KVC che potrebbe non riuscire nella nuova versione di iOS.

+0

Grazie, ottima risposta, buona fortuna qui su SO. –

+0

L'app è stata appena approvata con questo codice in quasi ogni angolo dell'app. Voglio dire, in termini di esecuzione, il codice è solo su un posto :) Quindi grazie ancora! –

+0

@farcaller, cosa pensi dell'uso di 'setValue: forKey:' su una API "privata"?Voglio impostare la proprietà '_customRightViews' su nil per un' UINavigationItem'. – Daniel

7

Cinque elementi di prova per "Non è privato"

  • E 'una proprietà che si può arrivare a in altri modi. Prova questo e uno di quei punti di vista è, in effetti, il _view ivar in questione UIBarButtonItem. Questo indica che l'accesso a questo UIView non è vietato, anche se il modo KVO potrebbe essere discutibile (ma ne dubito).

    NSArray *array = self.toolBar.subviews; 
        for (UIView *view in array) { 
         view.backgroundColor = UIColor.greenColor; 
        } 
    
  • In realtà attivano il KVO per questa proprietà. ivars non deve attivare l'API KVO, giusto?

  • @Farcaller menziona un caso simile che è in vendita nell'App Store. Dal momento che ha risposto entro i primi 20 minuti della domanda, è ragionevole (ma non sicuro!) Presumere che ci possano essere migliaia di app nell'App Store che lo fanno.

  • Questo UIView viene applicato ogni volta che si preme il pulsante, quindi non è possibile, ad esempio, impostare un rilevatore di gesti su di esso ed eseguirlo. Tuttavia, puoi sempre impostare lo stesso rilevatore di gesti ogni volta che lo view viene sostituito. Per me, questo è in realtà una prova più che non è una cosa privata dell'API, ma piuttosto devi stare molto attento quando lo usi (e usa KVO per assicurarti di avere l'ultima).

  • La mia app è in vendita su App Store e lo fa.

+3

Che risposta senza tempo. Probabilmente è ancora applicabile a iOS 9. – fatuhoku

+0

Immagino che questa sia la differenza tra _ ** private ** _ ("non usarlo, dobbiamo essere liberi di modificare questi dettagli di implementazione interni in qualsiasi momento") e _ ** non documentato ** _ ("usa a tuo rischio, non siamo responsabili"). –

Problemi correlati