iphone - Objective-C 运行时 : Swizzled method name?

标签 iphone objective-c ios uitextfield objective-c-runtime

试图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/

相关文章:

javascript - ipad/ipod touch 上的 flowplayer 视频无法使用 ipad 插件在 drupal7 中工作 - 字节范围 header 问题

iphone - admob/adsense 如何在 android 应用程序中工作?

objective-c - 我可以隐藏 UIDocumentInteractionController View 上的操作按钮吗?

ios - 删除 NSManagedObjectContext

ios - 如何让听众在离线时在 Firebase 中工作以进行多位置更新

ios - ivars 和循环方法

iOS - UITextView 中的新行字符

iphone - 检查我的服务器上的 plist 的新版本

iphone - 针对视网膜显示优化的 Sprite

objective-c - 在一个 NSOperationQueue 上抢占 NSOperation 并将 NSOperation 放置到一个单独的 NSOperationQueue 上?