在Interface Builder中继承xib文件

时间:2010-12-11 17:50:01

标签: iphone objective-c

我在IB中制作了ViewController.xib,其中有一个UITableView。 我想构建另一个xib文件,例如SearchViewController.xib,遗传自ViewController.xib。新的SearchViewController.xib应该继承UITableView,此外它应该有UISearchBarUIButton

可以使用Interface Builder制作这个场景吗?

6 个答案:

答案 0 :(得分:10)

不,NIB文件中没有继承的概念。您唯一的选择是复制原始文件并在副本中进行必要的更改。

答案 1 :(得分:4)

您可以使用Container View来重用特定的视图控制器。这样你只需要创建一次,添加逻辑一次就可以在任何地方重复使用组件:

enter image description here

这是容器视图上的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;
}