【问题标题】:iOS - is this declaration inside a class correct?iOS - 类中的这个声明是否正确?
【发布时间】:2012-10-07 20:50:59
【问题描述】:

假设我正在创建一个名为 myTextView 的 UITextView 子类。我将使该课程成为自己的代表。所以,我需要实现像

这样的委托方法
- (void)textViewDidBeginEditing:(UITextView *)textView {

我应该这样声明还是这样声明这个方法?

- (void)textViewDidBeginEditing:(myTextView *)textView {

在我看来它像递归,因为我在 myTextView 类中,定义了一个引用自身的委托...

什么是正确的方法?谢谢。

【问题讨论】:

  • 两者都可以(假设myTextView 是派生类名)。但第一个是习惯性的。 (顺便说一句,按照惯例,Objective-C 中的类名应该以大写字符开头。)

标签: iphone ios cocoa-touch ipad


【解决方案1】:

为了澄清,最好实现协议中定义的方法:

 - (void)textViewDidBeginEditing:(UITextView *)textView

如果您使用自定义类类型或任何类类型实现协议方法,这些方法仍然会被调用,因为没有执行类型检查。该参数实际上是您的自定义子类。无论如何,再次澄清一下,如果您想处理自定义子类的 ivars,我建议进行内部转换:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    MyTextView * myTextView = (MyTextView *)textView;
    ...
}

【讨论】:

  • "在其他情况下,它们不会被调用,因为您的类不符合协议。"不正确,因为respondsToSelector: 用于该检查 - 它不关心类型,只关心方法名称。
  • H2CO3,你是对的,它没有执行任何类型检查。无论如何,值得使用协议声明以免导致混淆(并且至少在默认情况下容易出现没有警告的错误),因为您将获得 UITextView 作为参数,而不是您声明的子类伊瓦斯。
  • @atxe 在这种情况下,请编辑您的答案,它只是 false 您写的内容。
  • @atxe 无论如何,这只是一个声明问题 - 传入的对象仍然是自定义类,而 not UITextField,不管是什么输入/转换到的类型。
  • @atxe 我不强硬,你的答案现在很完美。
猜你喜欢
  • 1970-01-01
  • 2020-08-07
  • 2023-03-16
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多