2011-10-20 19 views
6

Nel tentativo di Detect backspace in UITextField, ho provato la sottoclasse UITextField and overriding -[UIKeyInput deleteBackward], ma non viene mai chiamato. Quindi, sospetto che UITextField swizzles deleteBackward a un altro nome di metodo.Runtime Objective-C: nome del metodo Swizzled?

Utilizzando lo Objective-C Runtime, come è possibile determinare il nome del metodo deleteBackward impostato su swizzled? Quindi, come posso modificare l'implementazione in modo che UITextField chiami [self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""] quando il tasto di cancellazione viene premuto quando è vuoto.

Inoltre, questo tipo di metaprogrammazione farà rifiutare la mia app dall'App Store?

+0

+1, perché questa è una domanda ingannevolmente difficile. – NJones

+0

Hai mai risolto questo? Sto avendo lo stesso problema. – MdaG

risposta

3

Swizzling non modifica il nome di un metodo. Se lo facesse, sarebbe impossibile chiamare il metodo, dal momento che il runtime trova l'implementazione usando il nome. Tutto ciò che fa è cambiare l'indirizzo del codice che viene eseguito quando si chiama un metodo specifico.

La mia ipotesi sul motivo per cui il metodo deleteBackward non viene chiamato è che il sistema di input utilizza un metodo dal più complicato protocollo UITextInput invece, molto probabilmente replaceRange:withText:. Prova a farlo girare e ad effettuare la chiamata quando l'argomento text è una stringa vuota. Assicurati anche che la funzione di swizzling non restituisca un errore.

+0

Ma ['UITextInput'] (http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput) è conforme a [ 'UIKeyInput'] (http://developer.apple.com/library/IOS/documentation/UIKit/Reference/UIKeyInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIKeyInput), che richiede' deleteBackward' su essere implementato. Quindi, non dovrebbe richiedere 'UITextField' per implementare' deleteBackward'? – ma11hew28

+0

Inoltre, nella mia sottoclasse (e nella mia categoria) di 'UITextField', ho implementato' replaceRange: withText: 'con solo un' NSLog' per vedere se viene chiamato, e non lo fa. – ma11hew28

+0

@Matt Sì, richiede che 'deleteBackward' sia implementato, ma non significa necessariamente che verrà utilizzato. Era solo una possibilità. Tuttavia, rileggendo la tua domanda, ho notato che ti preoccupi solo quando è vuoto. Viene chiamato uno dei due metodi se non è vuoto? Forse il sistema di input non indica al campo di testo il keypress se è vuoto. – ughoavgfhw

Problemi correlati