自动为UITableViewController加载XIB

时间:2010-04-07 22:21:09

标签: iphone xcode uiviewcontroller interface-builder uitableview

进入一些有趣的事情,想知道我做错了什么或是否这是正确的行为。

我有一个自定义的UITableViewController。我假设(第一个错误),如果你这样初始化:

[[CustomTableController alloc] init];

如果它位于同一目录中,它将自动从同名的XIB(CustomTableController.xib)加载。

无论其

这不起作用;不加载XIB。但是,如果我将我的控制器的父类从'UITableViewController'更改为'UIViewController',那么每个人的工作都很精细!

通话:

[[CustomTableController alloc] init];

从我的xib加载控制器和视图。

我做错了吗?这是一个错误吗?预期的行为?

1 个答案:

答案 0 :(得分:26)

Cocoa Touch中的大多数类列出了一个“指定的初始值设定项”,当您将它们子类化时,您应该从init方法调用它们。当您创建自己的自定义类时,最好检查文档以查找超类的指定初始化程序。当您使用来自更通用的超类(在这种情况下通过调用 - [NSObject init]进行的其他初始化程序)初始化类时,您会抢夺直接超类的机会来正确初始化其状态。有时你可以逃脱这一点。通常你不能。

UIViewController的文档说明其指定的初始化程序是 - initWithNibName:bundle:。如果使用nil nibName调用此方法,它将查找与您的类名匹配的nib。对于-initUIViewController的行为没有记录。根据您所看到的行为,似乎可能正在调用[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类的文档要么指定一个指定的初始化程序,要么指定一些可以从子类中安全调用的初始化程序。总是参考超类的文档来确定你的子类应该调用哪个初始化器。