iOS 视图上的自定义子视图有空插座
Posted
技术标签:
【中文标题】iOS 视图上的自定义子视图有空插座【英文标题】:Custom Subview on a iOS view has null outlets 【发布时间】:2014-02-08 21:40:49 【问题描述】:我有一个名为 FeedView 的视图,由 FeedViewController 处理。
我还有一个名为“NearestStore”的 XIB,它由一个名为“NearestStoreViewController”的视图控制器处理。 NearestStore xib 有标签、按钮等。在视图控制器中,我有连接到 NearestStore.xib 中子视图的插座。
NearestStore 继承自 UIButton(因此更容易处理点击事件)。
在 FeedViewController.xib 上,我有一个设置为 NearestStore 类型的 UIButton。
到目前为止一切顺利。这是在我的 FeedViewController 上:
__weak IBOutlet NearestStoreButton *btn_nearestStore;
插座在xib上连接到插座。
NearestStoreViewController 有几个子视图的出口,例如:
@property (nonatomic, weak) IBOutlet UILabel *lbl_distance;
@property (nonatomic, weak) IBOutlet UIImageView *img_distance;
出于某种原因,在我的 FeedViewController 上,对 btn_nearestStore 的引用很好,但所有子视图都为零。
例如:
btn_nearestStore.lbl_distance
是零
我错过了什么?
【问题讨论】:
我觉得这很难理解。这两个视图控制器有什么共同点?只描述重要的细节。你是如何结合 XIB 的? FeedViewController 是父视图。在其中我有一个较小的视图,我想将它封装在另一个视图(和视图控制器)上,这样我就可以在另一个视图上重用。内部较小的视图是 NearestStoreButton 您是如何创建 NearestStoreButton 实例的?仅仅指定一个自定义类而不是 UIButton,并不意味着它将从 NearestStore nib 加载;您应该创建一个用于从外部 nib 文件加载实例或使用代码加载 nib 文件的包装器 发布您的 xib 文件或存储带有参考连接视图的板卡。以及用于从 xib 初始化视图的代码。 为什么子视图(非原子,弱) - 何时/谁创建 lbl_distance 和 img_distance 【参考方案1】:这听起来与系统应该工作的完全一样。使用 xibs 创建自定义小部件并不容易。
它是这样工作的:
您的 FeedViewController 将为相应的 FeedView 执行 xib 加载。
在此加载期间,它会注意到 NearestStoreButton 子视图。因此,它使用 NearestStoreButton 类上的- (id)initWithCoder:
消息创建了这样一个视图。它不会神奇地注意到相应的 .xib 或相应的 viewController。
如果您需要在 xib 中使用 xib,则需要为所有子视图手动加载。请记住,您需要为这些辅助 xib 创建/使用适当的所有者(视图控制器)。
【讨论】:
【参考方案2】:很难从您的描述中看出,但这听起来像是加载的 NearestStoreButton XIB 的“所有者”的问题。当你加载一个 NIB 时,你给加载器一个所有者,以及它的这个所有者,大多数出口绑定和操作都是在它上面进行的。如果您使用UINib
加载NearestStoreButton
,那么当您调用instantiateWithOwner:options:
时,请确保传递应将其设置为所有者的对象。
【讨论】:
【参考方案3】:你什么时候打电话给插座?如果您尝试访问视图的initWithCoder
方法中的属性,则不能保证对象已被实例化。
如果您在视图中的awakeFromNib
方法中访问您的属性,您应该能够获取它。例如,我有一个自定义视图,我的代码如下所示:
- (id)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
//Don't style the subviews in here since they won't be initialized
return self;
- (void)awakeFromNib
[super awakeFromNib];
[self styleViews];
- (void)styleViews
//access my properties and style them in here
【讨论】:
【参考方案4】:以下帖子包含有关使用 Nib 创建自定义视图的详细说明:
creating custom view using Nib
按照帖子中的说明创建 customInit 后,我可以分配 IBOutlets。
【讨论】:
感谢您的回答!由于外部链接可能会过期,因此答案的用处不大,您能否将链接中的基本步骤或摘要添加到您的答案中?以上是关于iOS 视图上的自定义子视图有空插座的主要内容,如果未能解决你的问题,请参考以下文章
如何在键盘视图和顶视图中添加自定义子视图? (iOS8 及以下无法在 iOS9 中使用)
iOS UIAutomation:访问在自动化脚本中添加到 UIScrollView 上的自定义子视图