【问题标题】:Method swizzled in objective-c is effective in everywhere在objective-c中调配的方法在任何地方都有效
【发布时间】:2016-09-01 14:56:28
【问题描述】:

我为方法swizzled创建了一个类别UITextField,它的名字类似于UITextField+MaxLength,我实现了+load方法来做swizzled,但是我没有在前缀头或其他文件中导入它,只是将它导入SomeViewController.

我认为 swizzled 应该只在 SomeViewController 中工作,但是为什么在每个 UITextField 甚至 UISearchBar 中都调用 swizzled 方法?并且在我运行应用程序时调用+load 方法?

编辑

我想我需要指出为什么我使用 swizzled,因为我想使用 KVO 来观察文本的变化,所以我 swizzled setText 并关联了一个名为 displayLength 的属性 NSNumber,所以,如果我不要使用 KVO,我可以删除该类别的 swizzled 部分,并且可以将子字符串剪切到特定的最大长度。

【问题讨论】:

  • 这就是 swizzling 的工作原理。如果要限制特定字段的长度,请使用文本字段委托方法。
  • 我真的很难理解你。但是,如果您想使用 KVO,请继续。你不需要为它做方法调配。 KVO 解决了您的问题并在每个实例基础上工作。 (这是因为它使用 isa swizzling 并覆盖方法而不是 swizzling 方法。)

标签: ios objective-c objective-c-category method-swizzling


【解决方案1】:

Swizzling 发生在运行时;如果您执行 swizzle,它会真正改变该类方法的实现。就好像你把代码改成了UITextField

这就是为什么方法调配是如此罕见和危险的事情。如果您只想更改 UITextField 的特定实例、子类(或者,从类别标题猜测您的意图,请使用委托)。

【讨论】:

  • 嗯,我认为我的问题是为什么当我什么都不做时调用负载,但是在我的项目中,我像我所做的那样使用了一些第 3 方,直到我使用负载才调用它,谢谢你的建议,但是如果我在我使用UITextField 的每个地方都实现委托方法,我会得到很多重复的代码,对吧?
  • 无需重复代码——如果所有文本字段的行为方式都相同,则可以为它们赋予相同的委托。
  • 也许我知道你的意思,但是如果另一个开发人员需要实现相同的委托方法,我应该为委托创建一个子类?
  • 现在这是一个不同的问题。幸运的是,已经有人回答了:stackoverflow.com/questions/25223407/max-length-uitextfield
  • 我知道我可以用委托方法做到这一点,我在创建这个类别后这样做,但我想使用类别,因为有时我需要实现委托方法textField:shouldChangeCharactersInRange:replacementString: 来做其他事情,做你知道我的意思?如果有其他方法可以解决这个问题,也许我可以使用其他方法来实现我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多