自定义 UIView 子类添加 nib 子视图

Posted

技术标签:

【中文标题】自定义 UIView 子类添加 nib 子视图【英文标题】:Custom UIView subclass add nib subview 【发布时间】:2014-06-04 13:39:27 【问题描述】:

我有一个自定义的UIView 子类,我们称它为CustomViewA,我使用initWithFrame: 对其进行初始化,并以编程方式添加一些UIView(如UILabel 等)。现在需要将另一个视图添加到CustomViewA,所以我创建了一个nib,我在其中布置了一些GUI元素(一个是UISegmentedControl

现在我遇到了一些关于如何正确将此笔尖作为子视图添加到CustomViewA 的问题。我需要为笔尖创建 .h/.m 文件吗?我希望 CustomViewA 在分段控件更改值时接收操作。

【问题讨论】:

【参考方案1】:
[[NSBundle mainBundle] loadNibNamed:@"MyNibName" owner:self options:nil];
[self.view addSubview:self.nibView];

在 nib 中,确保将文件所有者的类设置为要添加到的视图控制器。

您也可以像往常一样从笔尖添加属性和IBActions

【讨论】:

我没有将笔尖添加到视图控制器。我将它添加到另一个 UIView (CustomViewA)。但也许这并不重要?还有你在哪里设置 self.nibView ? 如果你将它添加到另一个 UIView,让 CustomViewA 的视图控制器将笔尖添加到 CustomViewA 另外,我从笔尖中的插座获得了 self.nibView 有没有办法避免使用另一个超级视图?在引用view 时只使用nibView 吗?【参考方案2】:

我需要为笔尖创建 .h/.m 文件吗?

不,你不需要。

分段控件改变值时如何接收动作?

您可以在您的xib中为分段控件设置一个标签号,它应该在您的xib中视图的所有子视图中是唯一的。

您可以通过代码获得分段控件。 UISegmentedControl *segmentedControl = (UISegmentedControl *)[view viewWithTag:1024];,拿到分段控件后,就可以用代码[segmentedControl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];添加动作了

编辑:如何获取xib的根视图?

使用下面的代码:

UIView *rootView = [[[NSBundle mainBundle] loadNibNamed:@"YourXibName" owner:nil options:nil] firstObject];

【讨论】:

我不能通过界面构建​​器添加一个动作并在我的CustomViewA 中定义一个(IBAction)吗?我尝试将其连接到分段控件,但是当我点击分段控件时没有任何反应? @PeterWarbo 你是如何加载 xib 的?你在加载时设置了xib的所有者吗?如果通过 IB 添加操作并在 CustomViewA 中定义 (IBAction),则应使用 UIView *rootView = [[[NSBundle mainBundle] loadNibNamed:@"YourXibName" owner:self options:nil] firstObject]; 加载 xib。 是的,我按照您的描述加载了它...视图在屏幕上正确显示,但是当我点击分段控件时没有任何反应。在界面生成器中,它说它已连接到 UIControlEventValueChanged 以执行我的操作... @PeterWarbo 您是否将文件所有者的类别设置为CustomViewA 是的...我该如何调试这个?【参考方案3】:

我终于弄清楚发生了什么。我添加到CustomViewA 的笔尖被添加到CustomViewAs 框架之外。所以很明显,当子视图在父视图的框架之外时,它不会拦截触摸。

【讨论】:

以上是关于自定义 UIView 子类添加 nib 子视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 中 Nib 加载的子视图的位置不正确

带有 nib 子视图的自定义 UIVIew 无

将子类 UIView 添加到具有自动布局约束的 Nib

如何在加载了 nib 文件的 UIView 中调整子视图的大小

如何将 UIView 插座连接到自定义子视图

iOS:使用 nib 子类化 UITableViewCell,进入 UIView(不是视图控制器)子类