【问题标题】:Conceptually, is subclassing UIView correct?从概念上讲,子类化 UIView 是否正确?
【发布时间】:2014-03-09 22:24:45
【问题描述】:

(我并不是说不是,这是我更多的要求,以确保我正确实施了面向对象的原则。)

假设我想创建一个UIView,其中包含一个UIImageView,并在UIImageView 下方添加一个UILabel

在 iOS 应用程序中,如果我想在应用程序的多个部分中使用此 UIView 设置,最好的方法是什么?

我阅读的很多教程似乎都指向子类UIView,并且在init 方法之一中创建子视图,然后将它们添加到self,瞧,只需创建此@987654329 的新实例@ 子类,你有一个 reusable 实现。

但是这个“带有标题的图像”概念作为 UIView 的 子类 有意义吗?我理解子类化和继承就像你有一个名为Vehicle 的超类,你创建了一个名为Truck 的子类。如果你看它,“卡车”是一个“车辆”,这就是我对继承的理解。

“带标题的图像”是一个“视图”

在继承中具有概念意义?我知道很多人会说“当然可以!”但我只是看着它,并认为它不完全是超类的派生或定制,而是其他一些的合并。

如果我要创建类似的东西,我几乎在想我想要一个可重用的 UIView 自定义实例,而不是 UIView 的子类,但也许我'我对子类化的定义过于尖锐。

如果我只想要一堆红色的UIButtons 并带有可以重复使用的标签的特殊字体怎么办?子类化真的有用吗?

子类化是最好的选择吗?或者也许从笔尖创建它并用代码导入它会更好?

【问题讨论】:

  • UIView 的子类非常有意义。可能会让您感到困惑的是,您的 UIView 子类可能会成为不同视图的“子视图”,并且您可以将“子视图”添加到您的 UIView 子类中。子类和子视图是两个完全不同的东西——“普通”对象中的“isa”和“hasa”关系之间的区别。
  • (你不应该子类化的唯一 Cocoa 类是那些在他们的文档中说“不建议对此类进行子类化”的内容。其他一切都是公平的游戏。)

标签: ios objective-c inheritance uiview subclass


【解决方案1】:

子类化它是一个非常好的选择。你需要记住,UILabel 和 UIImageView 实际上是 UIView 的子类。事实上,UIKit 中的一切都是从 UIView 派生的。子类化的全部意义在于自定义您的对象。这绝对是解决这个问题的好方法。

【讨论】:

  • 但是子类化某些对象不是不合适吗? not to subclass UIButton 很受欢迎,那么如果我想要一个特定的、可重用的 UIButton 实现,我该怎么做呢? UIPageViewController 是另一个你不应该继承 prior to iOS 6 的子类,如果我想自定义它以便于重用呢?
  • 子类化的问题似乎是样式,如果您假设使用UIButtonTypeCustom 进行子类化应该没问题。没有关于继承 UIButton 的“注释”,例如 NSStream。但即便如此,以及诸如NSString 之类的其他内容也可以归类,但可能需要社会关怀。我已经对所有三个进行了子类化,UIButton 是最简单的,NSStream 是最难的。
  • 该帖子甚至指出 UIButton 是规则的例外。总体而言,您需要避免子类化的事情很少(除非您只是引入了不必要的复杂性)。我之前对 UIButton 进行了子类化。
【解决方案2】:

如果您只需要使用 nib/xib 文件重用视图 + 布局就足够了。 如果你想要一些参数和动作,子类可能会更好。

【讨论】:

    【解决方案3】:

    如果我正在创建类似的东西,我几乎在想我想要一个可重用的 UIView 自定义实例,而不是 UIView 的子类,但也许我对子类化的定义过于尖锐。

    您正在考虑prototyping,这是设计面向对象系统的合理方式。 Self 是典型的例子,但 JavaScript 可能是最著名的。 Objective-C 通常不使用原型。 (除了它实际上将它用于非常安静的视图之外,几乎与您描述它的方式完全相同……稍后再说。)

    首先从聚合的角度考虑类,然后再考虑继承是非常正确的。在许多情况下,创建一个配置股票UIViewUIViewController 子类更为自然。但有时这很笨拙。再一次,我会查看 UIKit 示例,以获取有关 UIView 子类中什么是有意义的以及什么没有意义的指导。但是,将UIView 的子类子类化几乎没有意义。深层对象层次结构在(好的)ObjC 中并不常见。最好将复杂性转移到控制器和委托中。

    但我说过UIView 大量使用原型。它确实如此。它们被称为 nib 文件。 nib 文件只不过是一堆克隆到系统中的序列化原型(大多数时候这些是视图,但它们实际上可以是任何东西)。在 Interface Builder 中配置您的复杂视图,然后使用 UINib 自己实例化它们并没有错。我自己完成了这项工作,而不是创建复杂的 UIView 子类。

    而且每隔一段时间,克​​隆一个现有的、预配置的视图原型确实是有意义的,我已经在几个案例中做过(特别是当用户以某种方式配置了视图时)。您可以使用NSCoding 来做到这一点(您将视图序列化为数据,然后将其反序列化回视图)。但这不是常用的方法。

    综上所述,对于您的带字幕图像视图的特定情况,我几乎可以肯定将其构建为 UIView 个人子类。

    【讨论】:

      【解决方案4】:

      对于您的用例,您似乎有一个好主意,并且似乎是拥有另一种观点的明智选择。 DDDImageCaptionView

      确保你有一个良好的model, view and controller 分隔,以确保你没有使用视图来存储数据,视图应该是哑的并显示它所告诉的内容。

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 1970-01-01
        • 2023-03-22
        • 2015-08-21
        • 2014-03-23
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多