【问题标题】:Custom Subview on a iOS view has null outletsiOS 视图上的自定义子视图有空插座
【发布时间】: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

标签: ios objective-c ios7 xib subview


【解决方案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。

        【讨论】:

        • 感谢您的回答!由于外部链接可能会过期,因此答案的用处不大,您能否将链接中的基本步骤或摘要添加到您的答案中?
        猜你喜欢
        • 1970-01-01
        • 2016-07-07
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多