从 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
的子类,然后创建了 alloc
和 init
该子类并将其设置为所有者。
您的代码示例实际上是在实例化您的视图的两个副本,一个是在故事板调用 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 或带有情节提要的其他场景添加子视图的主要内容,如果未能解决你的问题,请参考以下文章