UIViewController没有加载我的自定义UIView

时间:2008-12-15 05:07:06

标签: cocoa-touch

这对于一个大师来说应该是直截了当的。我没有真正写出任何代码,只有几个控制器和一个自定义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不会受到影响?如果我想以编程方式自定义此视图该怎么办?

2 个答案:

答案 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>