2015-05-27 2 views

risposta

11

Sì, entrambi funzionano. La differenza è che dichiarandolo a un pulsante, si ottiene un riferimento tipizzato come UIButton anziché AnyObject (o id in Objective-C). Se non lo fai, dovrai farlo manualmente all'interno del codice.

Si consiglia di lasciarlo su AnyObject nel caso in cui l'azione abbia un codice che si desidera chiamare da qualsiasi altra parte, anziché solo l'azione del pulsante.

Ad esempio un pulsante di aggiornamento, potrebbe essere necessario eseguire un aggiornamento programmatico. Se hai impostato il tuo parametro action su UIButton, devi inviare un UIButton (ma perché lo stai facendo programmaticamente, giusto?). Mentre se è AnyObject, puoi inviare 'self'. Che ti farà anche distinguere se l'aggiornamento è stato fatto su azione o programmaticamente.

Spero che questo spieghi. Siamo spiacenti per nessun codice. Non mi sto dedicando molto alla codifica di Swift. Le modifiche sono benvenute.

EDIT

Quindi, anche se è ANYOBJECT, esso ha le proprietà UIButton. Digita semplicemente cast per usarli.

-2

Se è anyObject, quindi non ha nessuna proprietà di UIButton. Quando fai clic sul pulsante e l'attivazione di IBAction, il mittente contiene informazioni sulla cosa che ha attivato l'azione.

Ad esempio, per un UIButton, è possibile eseguire una query sul testo di UIButton quando viene attivato l'IBAction.

Tuttavia, in una situazione in cui IBAction è connesso a due diversi controlli dell'interfaccia utente, diciamo, un pulsante e un dispositivo di scorrimento, interrogando il mittente quando è di tipo UIButton (mentre l'elemento dell'interfaccia utente di attivazione è UISlider) causerà il crash del programma. Se hai AnyObject, sarai in grado di verificare se il mittente è UIButton o UISlider e poi fare qualcosa.

In generale, se non ti interessa il mittente, lascia vuoto, così le persone che leggono il tuo codice sapranno che non stai utilizzando il mittente per nulla.

+0

E come Paul Hegarty (professore a Stanford) ha detto, Apple dovrebbe semplicemente cambiarlo in 'UIButton' di default. È solo fastidioso dover cambiare tutto il tempo manualmente. – Eendje

+3

Stai sviando Kelvin. Non puoi dire che non ha le proprietà Buttons se è AnyObject. –

10

Se si intende utilizzare la funzione solo con UIButton, è consigliabile dichiarare il mittente come UIButton. Questo ti fa risparmiare un po 'di codice e dice anche a chiunque in futuro leggendo il tuo codice che ti aspetti solo che la funzione venga usata con un UIButton.

L'utilizzo di AnyObject funziona, ma è necessario eseguire un if let button = sender as? UIButton { } per accedervi come un pulsante. In questo modo puoi reagire in modo diverso a seconda di cosa sia effettivamente il mittente, ma io non consiglio di farlo.