2011-10-20 10 views
6

Detect backspace in UITextFieldに、 をサブクラス化しようとしましたが、UITextField and overriding -[UIKeyInput deleteBackward]は呼び出されません。だから、私はUITextField swizzles deleteBackward別のメソッド名を疑う。Objective-Cランタイム:Swizzledメソッド名?

Objective-C Runtimeを使用すると、deleteBackwardのどのメソッド名にスウィズルされたのかをどのように判断できますか?次に、UITextFieldが空のときに削除キーが押されたときに[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""]を呼び出すように実装を変更するにはどうすればよいですか。

また、このようなメタプログラミングによって私のアプリケーションはApp Storeから拒否されますか?

+0

+1これは賢明に難しい質問です。 – NJones

+0

これを解決しましたか?私は同じ問題を抱えています。 – MdaG

答えて

3

スウィズルはメソッドの名前を変更しません。実行した場合、メソッドを呼び出すことは不可能です。実行時には名前を使用して実装が検出されるためです。特定のメソッドを呼び出すときに実行されるコードのアドレスを変更するだけです。

deleteBackwardメソッドが呼び出されていない理由は、入力システムがより複雑なUITextInputプロトコルのメソッドを代わりに使用しているということです(おそらくreplaceRange:withText:)。 text引数が空の文字列である場合、それを振る舞い、あなたの呼び出しを実行してください。また、スウィズル機能がエラーを返さないようにしてください。

+0

しかし、['UITextInput'](http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput)は[ 'UIKeyInput'](http://developer.apple.com/library/IOS/documentation/UIKit/Reference/UIKeyInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIKeyInput)、' deleteBackward'が必要です実装される。だから、 'deleteBackward'を実装するために' UITextField'を必要とすべきではありませんか? – ma11hew28

+0

また、 'UITextField'の私のサブクラス(と私のカテゴリ)では、' NSLog'だけで 'replaceRange:withText:'を実装して呼び出されるかどうかを調べました。 – ma11hew28

+0

@Mattはい、 'deleteBackward'が実装されている必要がありますが、必ずしもそれが使用されることを意味しません。それは単なる可能性でした。しかし、あなたの質問を読んで、私はあなたが空であることだけを心配していることに気付きました。どちらのメソッドも空でない場合は呼び出されますか?たぶん入力システムは、キーフィールドが空の場合、キーフィールドについてテキストフィールドに指示しないかもしれません。 – ughoavgfhw