所以我有一个UIView的子类 - 让我们称之为CustomView - 带有一个XIB文件,用于其子视图的布局。
在界面构建器中,我将顶级视图的自定义类设置为CustomView,并创建一个类方法来加载XIB,并在我需要在应用程序的其他位置使用它时返回该顶级视图。
CustomView.m
+(instancetype)newCustomView
{
CustomView *customView = [[[NSBundle mainBundle] loadNibNamed: @"CustomView" owner: nil options: nil] firstObject];
...
return customView;
}
ViewController.m
-(void)viewDidLoad
{
...
CustomView *firstCustomView = [CustomView newCustomView];
[self.view addSubview: firstCustomView];
}
这一切都有效,我可以很方便地访问CustomView的网点,但感觉非常hacky。查看使用关联的XIB初始化UIView子类的传统方法我发现使用相同方法的一篇文章,但大多数教程使用了以下的一些变体:
将文件所有者设置为UIView子类。 (不要为顶级视图设置自定义类)
将classView插座添加到类中,并将其设置为界面构建器中的顶级视图。
创建一个加载Nib的方法,并将contentView添加为该类的子视图。
在initWithFrame:和initWithCoder中调用此方法:。
这也有效,但我不明白为什么有必要将contentView属性设置为IB的顶级视图作为子视图。如果CustomView已经是UIView,为什么我不能将自己设置为顶级视图?那不是更直接吗?我觉得我尝试理解的越多越有意义。
为任何帮助干杯!