Objective-C运行时:Swizzled方法名称?

ma1*_*w28 6 iphone objective-c objective-c-runtime uitextfield ios

为了尝试在UITextField中检测退格,我尝试了子类化UITextField和重写-[UIKeyInput deleteBackward],但它永远不会被调用.所以,我怀疑UITextField碎冰鸡尾酒deleteBackward另一个方法名.

使用Objective-C运行时,如何确定哪个方法名称deleteBackward已被调整为?然后,我如何更改实现,以便在空键时按下删除键时UITextField调用[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""].

此外,这种元编程会让我的应用程序被App Store拒绝吗?

ugh*_*fhw 4

Swizzling 不会更改方法的名称。如果是这样,则无法调用该方法,因为运行时使用该名称查找实现。它所做的只是更改调用特定方法时运行的代码的地址。

我对为什么deleteBackward没有调用该方法的猜测是,输入系统很可能正在使用更复杂的UITextInputreplaceRange:withText:协议中的方法。text尝试混合它并在参数为空字符串时执行调用。还要确保您的 swizzling 函数不会返回错误。