我有一个实例化的 UITableViewController
子类,具体取决于它的使用位置,是在 NIB 中还是通过代码。在这两种情况下,我都想在初始化方法中进行自定义。这是否意味着我需要同时实现 initWithNibName:bundle:
和 initWithCoder:
,并且每个方法都会调用其各自的 super 初始化程序?
虽然我现在不需要这个,但如果我还希望能够使用 initWithStyle:
实例化 View Controller 怎么办?那么我是否需要 3 个不同的 init 方法来复制相同的行为?
这似乎违反了整个指定初始化器约定,因为本质上有 3 个独立的初始化器,它们最终不会调用公共(public)初始化方法。或者有没有办法在支持 3 种不同的实例化路由的同时创建一个通用的指定初始化程序?
最佳答案
我的困惑是基于错误的信念,即每个类都应该有一个指定的初始化器。这不是真的,在 UITableViewController
的情况下,有 3 个指定的初始化程序(据我所知):
initWithStyle:
本地声明initWithNibName:bundle:
继承自UIViewController
initWithCoder:
采用NSCoding
协议(protocol)
您需要根据子类的实例化方式在子类中覆盖 1 个或更多。在我的例子中,我必须实现#2 和#3,因为类可以从 NIB 加载,或者通过引用 NIB 的代码实例化。 (我想您很少会在一个类中同时使用 initWithStyle:
和 initWithNibName:bundle:
。)
我找到了 Apple 的 Coding Guidelines for Cocoa 很有帮助。
关于iphone - 为 UITableViewController 子类重写哪个初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/743010/