【问题标题】:What superclass for a custom UI component?自定义 UI 组件的超类是什么?
【发布时间】:2013-03-30 15:53:55
【问题描述】:

我需要创建一个满足以下条件的自定义 UI 组件:

  • 它将包含 UIView、Label、Button 和 TableView 的组合。
  • 应该可以通过编程方式对其进行实例化 - 或者 - 在 nib 编辑器中放置 UIView 并将检查器中的类更改为我的自定义组件类。 (它会维护/保留放置的 UIView 中的主框架值)

我已经开始尝试它,我选择了 UIView 但它不处理 ..cellForRow... 单元格方法。另一方面,如果我使用 UIViewController,那么我在检查器中的类更改不起作用并且应用程序崩溃。

我应该选择哪一个 - UIView、UIviewController 或 NSObject?

【问题讨论】:

  • 如果继承 NSObject 则无法获取 UIView 等所有功能。我会说从最低级别扩展,然后使用协议来使用其他方法/功能/行为。
  • 在这种情况下,我将从 UITableView 继承,因为它是最复杂的 UIItem,因此大多数接口已经定义。 UIView 也可以工作,因为它是所有这些的共同基础。但随后必须添加 UIButton、UILabel 和 UITableView 的所有(需要的)附加方法和属性。所以最终它取决于新视图对象需要具有哪些接口以及它们需要覆盖到哪个扩展。然后我会选择其中大多数不需要在子类中覆盖并且可以按原样使用的那个。
  • 您的对象不必处理 cellForRowAtIndexPath: 或任何其他数据源方法——表格视图不需要。这应该由您分配为对象的数据源和委托的控制器处理,这可能是其视图将您的自定义对象作为子视图的控制器。我确实认为 UIView 是正确的超类。

标签: ios objective-c cocoa-touch custom-controls


【解决方案1】:

我会选择 UIViewController 或 UITableViewController,因为你说你有一个 tableView。如果你做一个 UIViewController,你可能必须在其中包含另一个 UITableViewController,使用 addChildViewController,解释 here

我认为您的应用程序崩溃的原因是您将类超类从 UIView 更改为 UIViewController,但在 Interface Builder 中您仍然只有一个 UIView 对象。您需要在 Interface Builder 中将其更改为 UIViewController,并选择您的类作为 File Owner。

【讨论】:

  • 我将如何满足能够将组件“放置”在 IB 中“作为任何其他控件”的要求?将其正确放置在 UI 层次结构中?
  • 如果您的意思是让您的自定义对象显示在 Interface Builder 库对象中,我认为这是不可能的。要通过 Interface Builder 添加,您必须添加 UIView 或视图容器,并且您可以处理它以在 init 方法中拥有所需的框架。
【解决方案2】:

如果您打算将其作为一个独立组件,并将所有逻辑都包含在控件中,那么我会将它基于 UIViewController,就像 Apple 对 MFMailComposeViewController 所做的那样。如果您希望它是一个严格的视图,没有自己的内置逻辑,而是委托该逻辑,则使用 UIView 并将表视图方法委托给使用它的控制器。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多