试图Detect backspace in UITextField ,
我试过子类化 UITextField
and overriding -[UIKeyInput deleteBackward]
,但它永远不会被调用。所以,我怀疑 UITextField
swizzles deleteBackward
到另一个方法名称。
使用 Objective-C Runtime ,如何确定哪个方法名称 deleteBackward
已被调配到?然后,我该如何更改实现,以便 UITextField
调用 [self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""]
为空时按下删除键。
此外,这种元编程是否会导致我的应用程序被 App Store 拒绝?
最佳答案
Swizzling 不会更改方法的名称。如果是这样,就不可能调用该方法,因为运行时使用该名称查找实现。它所做的只是更改调用特定方法时运行的代码的地址。
关于为什么未调用 deleteBackward
方法,我的猜测是输入系统正在使用更复杂的 UITextInput 中的方法。协议(protocol),最有可能是 replaceRange:withText:
。当 text
参数为空字符串时,尝试调配它并执行调用。还要确保您的 swizzling 函数不会返回错误。
关于iphone - Objective-C 运行时 : Swizzled method name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7839034/