UIViewController不加载我的自定义UIView
这应该是直截了当的上师。我没有真正写出任何代码,只有几个控制器和一个自定义的UIView。所有通过笔尖连接。该应用程序加载没有崩溃,但我看不到我的自定义UIView我的NSLog()命中。UIViewController不加载我的自定义UIView
我的应用程序委托具有默认的模板代码,它调用一个名为TabAnimationController的类。 TabAnimationViewController将其视图设置为TabView。我确信在TabAnimationViewController的NIB中,File的所有者被设置为TabAnimationViewController,并且我的UIView实例将其类设置为TabView。
在TabView.m我想看看NSLog是如何打的,它根本没有出现。
- (void)loadView {
NSLog(@"calling loadView");
}
- (id)initWithFrame:(CGRect)frame {
NSLog(@"Calling initWithFrame:");
return self;
}
奇怪。我不知道为什么即使经过适当的IB连接,我的NSLog不会显示出来。只有放入drawRect的任何东西都会调用。为什么不是initWithFrame或loadView被击中?如果我想以编程方式自定义此视图,该怎么办?
首先,当视图从nib文件脱水时,而不是initWithFrame
,initWithCoder
被调用。所以你也需要在initWithCoder
中实现你的初始化。 (如果你期望以编程方式创建你的TabView而不是在IB中挂钩,那么保持initWithFrame
初始化可能是一个好主意,只需将你的初始化重构为另一种方法,并从两种实现中调用它即可。)
另外在上面的初始化代码中,您必须始终调用超类的初始化。有一个锅炉钢板模式的所有自定义类在他们init
实现使用的是:
if (self = [super initXXX]) { do your initialization }
return self;
其次,loadView
这实际上是一个UIViewController
方法,如果view
出口控制的是无不是UIView
方法只调用。
除非您使用控制器以编程方式自己编写视图,否则无需重写loadView
。相反,您应该覆盖在视图加载后调用的viewDidLoad
以执行附加初始化。
最简单的方法就是在创建新项目时使用“基于视图的应用程序”模板。它建立了你需要开始的一切。
但是,总之,你正在寻找错误的方法。首先,除非您以编程方式创建视图,否则不应该覆盖loadView。如果是从XIB文件加载,请查看initWithNibName方法。
你也可能想看看viewDidLoad中,viewWillAppear中和触发viewDidAppear方法,嗯,这是当相当明显!
我会说你*必须*调用超级初始化,不应该。在上一次的WWDC上有这样一首美妙的歌曲:http://www.youtube.com/watch?v=ajlESsRXqmM – 2008-12-15 12:55:45