这对于一个大师来说应该是直截了当的。我没有真正写出任何代码,只有几个控制器和一个自定义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不会受到影响?如果我想以编程方式自定义此视图该怎么办?
答案 0 :(得分:8)
首先,当视图从nib文件中脱水时,而不是initWithFrame
,而是调用initWithCoder
。所以你需要在initWithCoder
中实现初始化。 (如果您预计以编程方式创建TabView而不是在IB中挂钩,那么保持initWithFrame
初始化也是一个好主意。只需将初始化重构为另一个方法并从两个实现中调用它。)< / p>
同样在上面的初始化代码中,您必须始终调用超类的初始化。所有自定义类都在其init
实现中使用了一个样板模式:
if (self = [super initXXX]) { do your initialization }
return self;
其次,仅当控制器的loadView
出口为零时,才会调用实际为UIViewController
方法而非UIView
方法的view
。
除非您使用控制器以编程方式自己编写视图,否则无需覆盖loadView
。相反,您应该覆盖在加载视图后调用的viewDidLoad
,以进行其他初始化。
答案 1 :(得分:0)
启动和运行它的最简单方法是在创建新项目时使用“基于视图的应用程序”模板。它设置了您需要的所有内容。
但是,简而言之,你正在寻找错误的方法。首先,除非您以编程方式创建视图,否则不应覆盖 loadView 。如果从XIB文件加载,请查看 initWithNibName 方法。
你可能还想看一下触发的 viewDidLoad , viewWillAppear 和 viewDidAppear 方法,好吧,当它出现时非常明显! / p>