遇到一些有趣的事情,想知道我是否做错了什么或者这是否是正确的行为。
我有一个自定义的 UITableViewController。我假设(第一个错误)如果你这样初始化:
[[CustomTableController alloc] init];
它会自动从同名的 XIB CustomTableController.xib 加载(如果它位于同一目录等)。
HOWEVER
这是行不通的;不加载 XIB。但是,如果我将控制器的父类从“UITableViewController”更改为“UIViewController”,则一切正常!
Calling:
[[CustomTableController alloc] init];
从我的 xib 加载控制器和视图。
难道我做错了什么?这是一个错误吗?预期的行为?
Cocoa Touch 中的大多数类都列出了一个“指定的初始化程序”,您应该从您的应用程序中调用它。init
当你子类化它们时的方法。当您创建自己的自定义类时,最好检查文档以查找超类的指定初始值设定项。当您使用更通用的超类中的其他初始化程序初始化该类时(您通过调用 -[NSObject init]
在这种情况下),您剥夺了直接超类正确初始化其状态的机会。有时你可以摆脱这个。通常你不能。
UIViewController 的文档指出其指定的初始值设定项是 -initWithNibName:bundle:
。如果您使用 nil nibName 调用此方法,它将查找与您的类名匹配的 nib。的行为-init
没有记录为UIViewController
。根据您所看到的行为,它似乎可能正在调用[self initWithNibName:nil bundle:nil]
,但打电话会更安全initWithNibName:bundle:
直接而不是依赖于这种未记录的行为。
UITableViewController 只定义了一个初始化器,-initWithStyle:
(尽管它没有指定此方法作为指定的初始值设定项)。此方法在不使用笔尖的情况下初始化 UITableViewController,这通常没问题。由于您不向 UITableView 添加子视图,因此通过 nib 配置 UITableViewController 通常不会获得太多好处。
如果你决定无论如何都要通过笔尖配置你的 UITableViewController,文档告诉我们我们可以安全地绕过-initWithStyle:
并调用 UIViewControllerinitWithNibName:bundle:
方法。以下是文档告诉我们的 UITableView 及其控制器在每种情况下如何初始化的内容:
如果通过指定 nib 文件initWithNibName:bundle:
方法(由超类 UIViewController 声明),UITableViewController 加载 nib 文件中存档的表视图。否则,它会创建一个具有正确尺寸和自动调整大小掩码的未配置的 UITableView 对象。您可以通过 tableView 属性访问此视图。
如果加载包含表视图的 nib 文件,则数据源和委托将成为 nib 文件中定义的对象(如果有)。如果未指定 nib 文件或 nib 文件未定义数据源或委托,则 UITableViewController 将表视图的数据源和委托设置为 self。
总之,大多数 Cocoa Touch 类的文档要么指定一个指定的初始值设定项,要么指定几个可以从子类安全调用的初始值设定项。请始终参考超类的文档来确定子类应该调用哪个初始化程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)