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