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 上的自定义子视图

IBOutlets/actions 和自定义子视图

UIStackView 中等宽的自定义子视图

SwiftUI GeometryReader 不会在中心布局自定义子视图

如何将自定义子视图的宽度设置为没有宽度限制的父 UIView 的 1/3?