2008-12-15 80 views
4

这应该是直截了当的上师。我没有真正写出任何代码,只有几个控制器和一个自定义的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被击中?如果我想以编程方式自定义此视图,该怎么办?

回答

8

首先,当视图从nib文件脱水时,而不是initWithFrameinitWithCoder被调用。所以你也需要在initWithCoder中实现你的初始化。 (如果你期望以编程方式创建你的TabView而不是在IB中挂钩,那么保持initWithFrame初始化可能是一个好主意,只需将你的初始化重构为另一种方法,并从两种实现中调用它即可。)

另外在上面的初始化代码中,您必须始终调用超类的初始化。有一个锅炉钢板模式的所有自定义类在他们init实现使用的是:

if (self = [super initXXX]) { do your initialization } 
return self; 

其次,loadView这实际上是一个UIViewController方法,如果view出口控制的是无不是UIView方法只调用。

除非您使用控制器以编程方式自己编写视图,否则无需重写loadView。相反,您应该覆盖在视图加载后调用的viewDidLoad以执行附加初始化。

+0

我会说你*必须*调用超级初始化,不应该。在上一次的WWDC上有这样一首美妙的歌曲:http://www.youtube.com/watch?v=ajlESsRXqmM – 2008-12-15 12:55:45

0

最简单的方法就是在创建新项目时使用“基于视图的应用程序”模板。它建立了你需要开始的一切。

但是,总之,你正在寻找错误的方法。首先,除非您以编程方式创建视图,否则不应该覆盖loadView。如果是从XIB文件加载,请查看initWithNibName方法。

你也可能想看看viewDidLoad中viewWillAppear中和触发viewDidAppear方法,嗯,这是当相当明显!