【问题标题】:inherit xib-file in Interface Builder在 Interface Builder 中继承 xib 文件
【发布时间】:2010-12-11 17:50:00
【问题描述】:

我有一个在 IB 制造的 ViewController.xib,它有一个 UITableView。 我想构建另一个 xib 文件,例如SearchViewController.xib,继承自 ViewController.xib。新的 SearchViewController.xib 应该继承 UITableView,另外它应该有一个 UISearchBar 和一个 UIButton

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

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

    【讨论】:

    • 正如 Ole 所说,没有继承。您可以并且应该继承处理共享功能的视图的控制器。
    • 另外,也可以为特定视图创建 xib(尽管它并不像应有的那么简单)。
    【解决方案2】:

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

    这是容器视图上的Apples documentation,希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      您需要单独的 .xib 文件,或者使用一个作为默认文件,然后以编程方式在代码中添加控件(例如 SearchViewController 等)。

      【讨论】:

        【解决方案4】:

        考虑它的方式是,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 参数连接。

        【讨论】:

        • 坦率地说,这里的最佳答案。
        【解决方案5】:

        在 xCode 的下一个版本中确实应该解决这个问题。因为您需要在代码中编写您的接口需要在其他类中继承,这在以后需要修改的情况下是一场噩梦。或者您可以复制/粘贴 xib 文件,这也是一场噩梦,因为您需要将它们全部打开并应用修改

        【讨论】:

          【解决方案6】:

          问题是子类用它的类名调用 initWithNibName。

          即使继承,我也会强制超类加载超类 xib(确保插座位于超类的 .h 中)

          在超类中重写 initWithNib(如果您创建了基于 xib 的 vc,它将与普通 init 一样被调用)

          -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
          {
              self = [super initWithNibName:@"NameOfTheSuperClass" bundle:nibBundleOrNil];
              if (self) {
              }
              return self;
          }
          

          【讨论】:

            猜你喜欢
            • 2010-12-10
            • 2010-10-31
            • 2023-03-08
            • 2011-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-13
            相关资源
            最近更新 更多