我在IB中制作了ViewController.xib
,其中有一个UITableView
。
我想构建另一个xib文件,例如SearchViewController.xib
,遗传自ViewController.xib
。新的SearchViewController.xib应该继承UITableView
,此外它应该有UISearchBar
和UIButton
。
可以使用Interface Builder制作这个场景吗?
答案 0 :(得分:10)
不,NIB文件中没有继承的概念。您唯一的选择是复制原始文件并在副本中进行必要的更改。
答案 1 :(得分:4)
您可以使用Container View来重用特定的视图控制器。这样你只需要创建一次,添加逻辑一次就可以在任何地方重复使用组件:
这是容器视图上的Apples documentation,希望它有所帮助!
答案 2 :(得分:1)
您需要单独的.xib文件,或者使用一个作为默认文件,然后以编程方式在代码中添加控件(例如SearchViewController等)。
答案 3 :(得分:1)
考虑它的方法是XIB文件是序列化的对象而不是类。除了一些基于原型的语言(如Javascript)之外,类的实例(即对象)不能被子类化。
然而,模拟这种方法的一种方法是创建一个UIView类型的父类,它将加载XIB并将其添加到自身(请记住,XIB包含可视元素的NSArray)。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TestView" owner:self options:nil];
UIView* mainView = (UIView*)[nibViews objectAtIndex:0];
self.label.text = @"Parent";
[self addSubview:mainView];
}
return self;
}
然后,孩子可以简单地覆盖初始化为
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.label.text = @"Child";
}
return self;
}
self.label
当然通过接口构建器链接到XIB文件中的UILabel,并在运行时通过owner:self
参数连接。
答案 4 :(得分:0)
在xCode的下一个版本中应该注意这个问题。因为你需要在代码中编写你的接口需要在其他类中继承,这是一个噩梦,如果以后需要修改。或者你可以复制/粘贴xib文件,这也是一个噩梦,因为你需要打开它们并应用修改
答案 5 :(得分:0)
问题是子类使用它的类名调用initWithNibName。
我会强迫超类加载超类xib,即使是继承的(确保出口位于超类的.h)
超类中的覆盖initWithNib(如果你创建了基于xib的vc,它将被调用以及普通的init)
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:@"NameOfTheSuperClass" bundle:nibBundleOrNil];
if (self) {
}
return self;
}