使用故事板从xib或其他场景添加子视图

shi*_*ami 20 view storyboard ios

我是iOS和Xcode的新手.我无法弄清楚如何设计一个单独的视图,并使用storyboard将其添加到主UIViewController中.

我做了不同的方法..

  1. 只需从xcode中的右下角窗口抓取一个UI对象,然后将其放在故事板的任何空间区域.但我不能像使用xib那样删除UI对象.
  2. 添加一个新的UIViewController.添加视图到UIViewController.在主ViewController.m中,我UIViewController在viewDidLoad中获取新实例,然后[self.view addSubview:newUIViewController.view].但是我看不到添加的视图.
  3. 我创建了一个新的xib文件.并添加一个视图.我也尝试在主要实例中获取实例ViewController.并且addSubview有了xib的观点.但它也失败了.

是否有正确的方法或任何可行的解决方案?

shi*_*ami 36

我想出了办法.描述如下:

  1. 创建.xib文件.例如:MyView.xib
  2. 创建一个objective-c类.例如:MyViewClass.h和MyViewClass.m
  3. 将.xib文件的所有者设置为该类.
  4. 在故事板上添加UIView元素,并将自定义类设置为objective-c类名(MyViewClass).
  5. 关键点是覆盖object-c类中的initWithCoder方法.

    - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder])) {
            [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0]];
        }
        return self;
    }
    
    Run Code Online (Sandbox Code Playgroud)

想法是故事板加载自定义类并调用initWithCode.索引0是.xib接口构建器中的根视图.

这有点棘手,但它确实有效.

  • 这不会创建2个视图吗?故事板中的一个和代码中的一个?因为它在Storyboard中创建了一个,并且在initcode中创建了一个.根据我测试的,似乎有两个被创建. (3认同)
  • 您的代码示例实际上是实例化视图的两个副本,一个是故事板,当它调用`initWithCoder:`并调用super时,另一个是当你调用`loadNibNamed:`来从nib加载视图时.你实际上想要做的事情,更糟糕的是,在你的initWithCoder方法中,自我= [[NSBundle mainBundle] loadNibNamed:@"MyView"owner:self options:nil] [0]`,并且_not_调用`[super initWithCoder:]` (2认同)
  • @AlexPretzlav:好像当你想返回不同的自我,一个像"NSGenericExpection:此编码器需要更换从的initWithCoder返回的对象"被提升.所以你真的必须将它添加为子视图. (2认同)