【问题标题】:Objective-C Runtime: Swizzled method name?Objective-C 运行时:混杂的方法名称?
【发布时间】:2011-10-20 16:19:16
【问题描述】:

试图Detect backspace in UITextField, 我试过子类化UITextField and overriding -[UIKeyInput deleteBackward],但它永远不会被调用。所以,我怀疑 UITextFielddeleteBackward 转换为另一个方法名称。

使用Objective-C Runtime,我如何确定deleteBackward 被混入了哪个方法名?那么,我该如何更改实现,以便UITextField 在删除键为空时按下时调用[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""]

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

【问题讨论】:

  • +1,因为这是一个看似很难的问题。
  • 你解决过这个问题吗?我也有同样的问题。

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


【解决方案1】:

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

我猜测为什么没有调用deleteBackward 方法是因为输入系统使用的是来自更复杂的UITextInput 协议的方法,很可能是replaceRange:withText:。当 text 参数为空字符串时,尝试调整它并执行您的调用。还要确保你的 swizzling 函数不会返回错误。

【讨论】:

  • 但是UITextInput符合UIKeyInput,需要实现deleteBackward。那么,这不应该需要UITextField 来实现deleteBackward 吗?
  • 另外,在我的 UITextField 的子类(和我的类别)中,我只使用 NSLog 实现了 replaceRange:withText: 以查看它是否被调用,但它没有。跨度>
  • @Matt 是的,它要求实现deleteBackward,但这并不一定意味着它会被使用。这只是一种可能性。但是,重新阅读您的问题,我注意到您只担心它是空的。如果不为空,是否会调用任何一种方法?如果它是空的,输入系统可能不会告诉文本字段关于按键的信息。
  • 我已经玩过这个了;当您在空文本字段上退格时,不会调用任何方法。
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2014-07-26
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
相关资源
最近更新 更多