为了尝试Detect backspace in UITextField
我尝试子类化 UITextField and overriding -[UIKeyInput deleteBackward] ,但是它从未被调用过。因此,我怀疑UITextFielddeleteBackward拖到另一个方法名称中。

使用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/

10-11 08:46