我有一个 UITableViewController 实例化的子类,具体取决于它的使用位置,在 NIB 中或通过代码。在这两种情况下,我都想在初始化方法中进行自定义。这是否意味着我需要同时实施 initWithNibName:bundle: initWithCoder:, ,并且每个方法都会调用其各自的超级初始值设定项吗?

虽然我现在不需要这个,但如果我还希望能够使用以下命令实例化视图控制器怎么办? initWithStyle:?那么我是否需要 3 个不同的 init 方法来复制相同的行为?

这似乎违反了整个指定的初始化器约定,因为本质上会有 3 个单独的初始化器,它们最终不会调用通用的 init 方法。或者有没有办法创建一个通用的指定初始化器,同时支持 3 种不同的实例化路由?

有帮助吗?

解决方案

我的困惑是基于错误的信念,即每个类都应该有一个指定的初始值设定项。这是不正确的,并且在这种情况下 UITableViewController 有 3 个指定的初始化器(据我所知):

  1. initWithStyle: 当地宣布
  2. initWithNibName:bundle: 继承自 UIViewController
  3. initWithCoder: 从采用 NSCoding 协议

您需要覆盖 1 或者更多 这些在你的子类中取决于你的子类如何实例化。就我而言,我必须实现 #2 和 #3,因为该类可以从 NIB 加载,或者通过引用 NIB 的代码进行实例化。(我想你很少会同时使用两者 initWithStyle:initWithNibName:bundle: 对于单个班级。)

我找到了苹果的 Cocoa 编码指南 有帮助。

其他提示

在内部,

  • UITableViewController 的 -initWithStyle: 打电话给超级的 -init 然后设置 _tableViewStyle 伊瓦尔。
  • UIViewController 的 -init 只需调用 -initWithNibName:bundle: 使用默认参数。
  • UITableViewController 才不是 覆盖 -initWithNibName:bundle:.

因此,如果您重写 -initWithNibName:bundle: 然后 -initWithStyle: 也将采用该更改。当然,为了安全起见(因为您不应该依赖实现细节),请覆盖它们。

(并且无需覆盖 -initWithCoder: 除非您取消/存档实例。)

要澄清,initWithStyle:,作为UITableViewController在该文档仅公布初始化,是它的一个明确的指定初始化。

initWithNibName:bundle:从UIViewController中继承并且是该类的指定初始化。这样,按照可可准则,UITableViewController必须覆盖此方法(通过执行它)。然而,这并不能使UITableViewController的指定初始化。

initWithCoder:是,当你指出,一个隐式指定初始化从NSCoding

实施:

- (void) viewDidLoad

和做你的组件初始化那里。

它具有仅执行初始化时的视图实际上是所请求的优点。

或者只是使由所有初始化调用的单独的安装方法。

这是除了职位,参考-initWithCoder以上:

如果添加通过界面生成器添加视图控制器到它的父(例如:如果视图控制器被连接到在界面生成器标签栏控制器),则需要覆盖-initWithCoder

( - 。当你编程创建视图控制器initWithNibName才会被调用)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top