为UITableViewController子类重写哪些初始化程序

Dan*_*son 16 iphone cocoa-touch objective-c designated-initializer

我有一个UITableViewController实例化的子类,取决于它在哪里使用,在NIB中或通过代码.在这两种情况下,我都想在初始化方法中进行自定义.这是否意味着我必须实现initWithNibName:bundle: initWithCoder:,并且将每个方法调用它的各超初始化?

虽然我现在不需要这个,但是如果我也希望能够实例化视图控制器initWithStyle:呢?那么我是否需要3种不同的init方法来复制相同的行为?

这似乎违反了整个指定的初始化程序约定,因为基本上会有3个单独的初始化程序不会最终调用公共init方法.或者有没有办法在支持3种不同的实例化路由时创建公共指定的初始化程序?

Dan*_*son 11

我的困惑是基于错误的信念,即每个类应该有一个指定的初始化器.这不是真的,如果UITableViewController有3个指定的初始化器(据我所知):

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

您需要在子类中覆盖其中的一个或多个,具体取决于子类的实例化方式.在我的情况下,我必须实现#2和#3,因为类可以从NIB加载,或者通过代码参考NIB实例化.(我想这是罕见的,你会同时使用initWithStyle:,并initWithNibName:bundle:为一个单一的类.)

我发现Apple的Cocoa编码指南很有帮助.


ken*_*ytm 7

在内部,

  • UITableViewController -initWithStyle:调用super -init然后设置_tableViewStyleivar.
  • UIViewController -init只是-initWithNibName:bundle:使用默认参数调用.
  • UITableViewController 不会覆盖-initWithNibName:bundle:.

因此,如果你覆盖-initWithNibName:bundle:那么-initWithStyle:也会采用变化.当然,为了安全起见(因为您不应该依赖于实现细节),请覆盖它们.

(-initWithCoder:除非您取消/归档实例,否则无需覆盖.)