进入一些有趣的事情,想知道我做错了什么或是否这是正确的行为。
我有一个自定义的UITableViewController。我假设(第一个错误),如果你这样初始化:
[[CustomTableController alloc] init];
如果它位于同一目录中,它将自动从同名的XIB(CustomTableController.xib)加载。
无论其
这不起作用;不加载XIB。但是,如果我将我的控制器的父类从'UITableViewController'更改为'UIViewController',那么每个人的工作都很精细!
通话:
[[CustomTableController alloc] init];
从我的xib加载控制器和视图。
我做错了吗?这是一个错误吗?预期的行为?
答案 0 :(得分:26)
Cocoa Touch中的大多数类列出了一个“指定的初始值设定项”,当您将它们子类化时,您应该从init
方法调用它们。当您创建自己的自定义类时,最好检查文档以查找超类的指定初始化程序。当您使用来自更通用的超类(在这种情况下通过调用 - [NSObject init]
进行的其他初始化程序)初始化类时,您会抢夺直接超类的机会来正确初始化其状态。有时你可以逃脱这一点。通常你不能。
UIViewController的文档说明其指定的初始化程序是 - initWithNibName:bundle:
。如果使用nil nibName调用此方法,它将查找与您的类名匹配的nib。对于-init
,UIViewController
的行为没有记录。根据您所看到的行为,似乎可能正在调用[self initWithNibName:nil bundle:nil]
,但直接调用initWithNibName:bundle:
而不是依赖此未记录的行为会更安全。
UITableViewController仅定义单个初始化程序-initWithStyle:
(尽管它没有将此方法指定为指定的初始化程序)。这个方法初始化你的UITableViewController而不使用nib,这通常很好。由于您没有将子视图添加到UITableView,因此通过nib配置UITableViewController通常无法获得很多。
如果您决定通过nib配置UITableViewController,文档告诉我们可以安全地绕过-initWithStyle:
并调用UIViewController的initWithNibName:bundle:
方法。以下是文档告诉我们在每种情况下如何初始化UITableView及其控制器的内容:
如果通过
initWithNibName:bundle:
方法(由超类UIViewController声明)指定了nib文件,UITableViewController将加载在nib文件中存档的表视图。否则,它会创建一个具有正确尺寸和自动调整大小掩码的未配置UITableView对象。您可以通过tableView属性访问此视图。如果加载了包含表视图的nib文件,则数据源和委托将成为nib文件中定义的那些对象(如果有)。如果未指定nib文件或者nib文件未定义数据源或委托,则UITableViewController将数据源和表视图的委托设置为self。
总之,大多数Cocoa Touch类的文档要么指定一个指定的初始化程序,要么指定一些可以从子类中安全调用的初始化程序。总是参考超类的文档来确定你的子类应该调用哪个初始化器。