故事板创建视图的 addSubview

Posted

技术标签:

【中文标题】故事板创建视图的 addSubview【英文标题】:addSubview for Storyboard created views 【发布时间】:2013-01-18 21:25:30 【问题描述】:

至少我认为这是一个基本问题。我刚开始以编程方式处理视图。

在 RouteCaptureViewController.h 中:

@property (strong, nonatomic) IBOutlet UIView *routeCaptureSuperView;

@property(nonatomic, weak) IBOutlet UIImageView *captureImageView;
@property(nonatomic, retain) IBOutlet UIImageView *previewImageView;
@property (weak, nonatomic) IBOutlet UIView *captureRouteButtonView;

在我的故事板中:

我检查了所有插座都已正确连接。

我在这样的方法中实现 addSubview 并且没有任何反应:

  [self.routeCaptureSuperView addSubview:self.captureRouteButtonView];
  [self.routeCaptureSuperView addSubview:self.captureImageView];

以下几行以前在代码中有效:

[self.captureImageView removeFromSuperview];
[self.captureRouteButtonView removeFromSuperview];

我知道 self.routeCaptureSuperView 不是来自 NSLog 的 nil

【问题讨论】:

您期望发生什么?您已经添加了一个 UIView 和 2 个 UIImageViews,但除非您在其中添加了图像/颜色,否则它们都是空白的。 @Fogmeister。所以我显然在这里遗漏了一些东西。以 captureRouteButtonView 为例。我将它添加到情节提要中,当视图最初加载时它会显示出来。我有一个指向它的 IBOutlet 指针 *captureRouteButtonView。我的想法是,当我使用 *captureRouteButtonView 实现 addSubview 时,它应该添加我在 Storyboard 中创建的视图,以及它包含的按钮。 【参考方案1】:

如果我理解正确并且您删除了视图以稍后再次添加它们,我可以做出有根据的猜测:

在您将removeFromSuperview 发送到您的视图的那一刻,它们会被释放,因为它们仅被声明为weak。 Weak 意味着如果对象被释放,则该属性将为 nil'd,因为与该对象的最后一个强关系已被释放。

父视图是与这两个视图保持最后牢固关系的对象。

尝试在两个子视图的@property 声明中将weak 更改为strong

【讨论】:

这很有效,帮助我更多地理解了基本的 Objective-C 开发。我只是感到困惑,并认为自从我在 Storyboard 中创建它们以来,它们仍然存在于某个地方。但是,由于我基本上是在此视图控制器中切换视图,因此我认为使用层次结构中视图的索引可能是一种更合乎逻辑的方式。 关于您的解决方案的一个问题:我还在学习并且只使用过 ARC,因此尚未密切关注内存管理。如果我将@property 更改为strong,我应该关注它们的释放/释放,还是在卸载视图控制器时由 ARC 处理? 您根本不必在 ARC 中发布。但是,您仍然必须考虑一下内存管理以避免诸如保留周期之类的事情。 *** 对 ARC 有很好的问题,很好地解释了这个话题。顺便说一句,如果您只是想“切换”视图,您可能只需将 hidden 设置为 YES 和 NO。

以上是关于故事板创建视图的 addSubview的主要内容,如果未能解决你的问题,请参考以下文章

故事板集合视图拒绝在以编程方式创建的按钮前面

如何在故事板中正确创建叠加视图?

何时为新屏幕创建新的故事板与视图控制器?

如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?

为啥 addSubview: with autolayout 添加一个尺寸不好的子视图?

故事板和程序化视图