从 xib 或带有情节提要的其他场景添加子视图

Posted

技术标签:

【中文标题】从 xib 或带有情节提要的其他场景添加子视图【英文标题】:Add subview from a xib or another scene with storyboard 【发布时间】:2012-01-06 06:18:12 【问题描述】:

我是 ios 和 Xcode 的新手。 我不知道如何设计一个分离的视图并使用情节提要将其添加到主 UIViewController 中。

我做了不同的方法..

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

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

【问题讨论】:

How do I create a custom iOS view class and instantiate multiple copies of it (in IB)?的可能重复 【参考方案1】:

我想出了一个办法。 描述如下:

    创建一个 .xib 文件。例如:MyView.xib 创建一个objective-c 类。例如:MyViewClass.h 和 MyViewClass.m 将 .xib 文件的所有者设置为类。 在情节提要上添加 UIView 元素,并将自定义类设置为 Objective-c 类名 (MyViewClass)。

    关键是重写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;
    
    

这个想法是自定义类由故事板加载,并调用 initWithCode。 索引 0 是 .xib 界面构建器中的根视图。

这有点棘手,但很有效。

【讨论】:

我做了一些非常相似的事情,但我不这样做 owner:self 因为我不希望我的 XIB 的所有出口/动作/代码都嵌入到我的视图控制器中(通常我想要在许多地方重复使用)。我创建了 UIView 的子类,然后创建了 allocinit 该子类并将其设置为所有者。 您的代码示例实际上是在实例化您的视图的两个副本,一个是在故事板调用 initWithCoder: 并且您调用 super 时,另一个是在您调用 loadNibNamed: 以从中加载视图时笔尖。您实际上想要做的事情,更骇人听闻的是,在您的 initWithCoder 方法中是self = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil][0],并且调用[super initWithCoder:] @AlexPretzlav :似乎当您想要返回不同的自我时,会引发“NSGenericExpection:此编码器要求从 initwithcoder 返回替换的对象”。所以你真的必须将它添加为子视图。 这不会创建 2 个视图吗?一个在故事板中,一个在代码中?因为一个是在 Storyboard 中创建的,一个是在 initcode 中创建的。根据我的测试,似乎创建了两个。 你拯救了我的一天和我的昨天:D【参考方案2】:

在故事板中,拖放一个视图控制器。视图控制器带有一个主视图。通过单击添加的视图控制器外部然后单击它的中心来选择该主视图。现在,只需像使用 IB 一样将 uiview 或其他任何内容拖到该主视图中。

【讨论】:

这就是我在第二种方法中所做的。但我看不到添加的视图。

以上是关于从 xib 或带有情节提要的其他场景添加子视图的主要内容,如果未能解决你的问题,请参考以下文章

无法同时满足约束 - 在添加子视图时

从情节提要重新加载视图时,以编程方式添加的 iOS 子视图会丢失

如何在情节提要场景中嵌入自定义视图 xib?

将 XIB 中的按钮链接到情节提要中的视图控制器

如何将我的新视图添加到情节提要?

您可以使用为带有情节提要的 xib 创建的视图控制器吗?