我有一个UITableViewController
实例化的子类,取决于它在哪里使用,在NIB中或通过代码.在这两种情况下,我都想在初始化方法中进行自定义.这是否意味着我必须实现initWithNibName:bundle:
和 initWithCoder:
,并且将每个方法调用它的各超初始化?
虽然我现在不需要这个,但是如果我也希望能够实例化视图控制器initWithStyle:
呢?那么我是否需要3种不同的init方法来复制相同的行为?
这似乎违反了整个指定的初始化程序约定,因为基本上会有3个单独的初始化程序不会最终调用公共init方法.或者有没有办法在支持3种不同的实例化路由时创建公共指定的初始化程序?
我的困惑是基于错误的信念,即每个类应该有一个指定的初始化器.这不是真的,如果UITableViewController
有3个指定的初始化器(据我所知):
initWithStyle:
在当地宣布
initWithNibName:bundle:
继承自 UIViewController
initWithCoder:
从采用NSCoding
协议
您需要在子类中覆盖其中的一个或多个,具体取决于子类的实例化方式.在我的情况下,我必须实现#2和#3,因为类可以从NIB加载,或者通过代码参考NIB实例化.(我想这是罕见的,你会同时使用initWithStyle:
,并initWithNibName:bundle:
为一个单一的类.)
我发现Apple的Cocoa编码指南很有帮助.
在内部,
UITableViewController -initWithStyle:
调用super -init
然后设置_tableViewStyle
ivar.
UIViewController -init
只是-initWithNibName:bundle:
使用默认参数调用.
UITableViewController 不会覆盖-initWithNibName:bundle:
.
因此,如果你覆盖-initWithNibName:bundle:
那么-initWithStyle:
也会采用变化.当然,为了安全起见(因为您不应该依赖于实现细节),请覆盖它们.
(-initWithCoder:
除非您取消/归档实例,否则无需覆盖.)