【问题标题】:Is there any way to DRY my Objective-C iOS ViewControllers?有什么方法可以干燥我的 Objective-C iOS ViewControllers?
【发布时间】:2012-03-06 16:20:42
【问题描述】:

我有一组控制器,其中大多数具有相似的功能。

例如:

  • 控制器 A 有方法 1 和方法 2。
  • 控制器 B 有方法 2 和方法 3。
  • 控制器 C 有方法 1 和方法 3。

子类化在这里并不是一个真正的选择,因为我特别不希望控制器 B 具有方法 1。

协议也不是很理想;他们仍然要求我在每个控制器中定义我的方法的副本。

有没有办法在一个地方定义一个方法,并在 Objective C 中需要时将此功能混合到类中?

【问题讨论】:

  • 我很好奇。你能解释一下如果控制器 B 有一个与方法 1 具有相同签名的方法会有什么问题吗?

标签: ios5 xcode4 objective-c-2.0


【解决方案1】:

【讨论】:

  • 感谢您的提示...哪里是定义可以从多个文件访问的块的最佳位置?只是在一个blocks.m 文件中并将blocks.h 导入到需要它的类中?
【解决方案2】:

一种可能性是根本不使用一个类。由于我猜这些方法需要访问一些控制器的字段,因此您可以使用一个函数,该函数接收一个指向 UIViewController 的指针作为参数,并从函数内部访问它的字段。
如果每种方法的行为方式略有不同,具体取决于您使用的是ControllerAControllerB 还是ControllerC,那么您可以使用isKindOfClass 方法。例如:

    void method1(UIViewController* controller) {
        if( [(id) controller isKindOfClass:[ControllerA class]] ) {
             //do something
        }
    }

【讨论】:

  • 如何拥有 ControllerA 子类 M1 和 M2? Objective C 不支持多重继承。在这种情况下,您有什么想法可以工作吗?
  • @Jim 实际上我犯了一个很大的错误。你完全正确,Objective-C 不支持多重继承。我编辑了我的答案。猜猜我今天真的很累。
  • 没关系。我经常这样做,并且担心一些巨魔会立即投反对票。我支持你:)
猜你喜欢
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
相关资源
最近更新 更多