这对于一个大师来说应该是直截了当的.我没有真正写出任何代码,只有几个控制器和一个自定义UIView.全部通过笔尖连接.该应用程序加载而不会崩溃,但我无法从我的自定义UIView中看到我的NSLog()命中.
我的应用程序委托具有默认模板代码,该代码调用我的一个名为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不会受到影响?如果我想以编程方式自定义此视图,该怎么办?
首先,当一个视图是从笔尖脱水文件,而不是initWithFrame
,initWithCoder
被调用.因此,您还需要实现初始化initWithCoder
.(initWithFrame
如果您期望以编程方式创建TabView而不是在IB中挂钩,那么保持初始化也是一个好主意.只需将初始化重构为另一个方法并从两个实现中调用它.)
同样在上面的初始化代码中,您必须始终调用超类的初始化.所有自定义类在其init
实现中都使用了锅炉板模式:
if (self = [super initXXX]) { do your initialization } return self;
其次,只有当控制器的出口为零时才调用loadView
实际上是UIViewController
方法而不UIView
调用方法view
.
除非您使用控制器以编程方式自己编写视图,否则无需覆盖loadView
.相反,您应该覆盖viewDidLoad
(在加载视图后调用)进行其他初始化.