7

我想知道如果 UIView 对象的单个实例同时添加为多个其他视图的子视图会发生什么。如果 UIView:removeFromSubview: 被调用,那么它是从所有超级视图中删除还是仅从当前显示的视图中删除?

背景:

我有一个类似状态栏的视图对象,需要在几个不同的其他视图中显示(每个其他视图由其自己的视图控制器管理)。

[即 a) 用户在一个视图中,b) 发生了一些事情使类似状态栏的视图出现,c) 用户切换到另一个视图 d) 状态栏在新视图中仍然可见 e) 状态栏会在一段时间后过期并从网站上消失。等等]

最初,我通过根据需要添加/删除它作为窗口的子视图来实现这一点,这是由单例管理的。然而,由于某些动画的一些复杂性,我将其添加为每个视图控制器的每个主视图的子视图。请注意,没有多个副本

当需要删除视图时,我调用它的 removeFromSuperview:,一切都运行良好。

但是我想知道删除视图的情况如何,是完全删除还是我需要做其他事情?

例如,视图可能会根据需要通过调用 addSubview 添加到 N 个视图控制器的视图中(如果该视图控制器实际启动,它只会添加到每个视图控制器)但是当它被删除时,我只调用 removeFromSuperview: 的视图当前加载的视图控制器,并非所有可能已添加到的视图控制器。

下次我导航到其中一个其他视图控制器时,即使我没有显式调用 removeFromSuperView,它也可以在没有视图的情况下正常显示。

正如我所说,一切正常,但是在我的脑海中,我觉得可能缺少一些东西?

希望这是可以理解的。

4

2 回答 2

15

您只能将其添加到一个视图中。文档是你的朋友!

  • (void)addSubview:(UIView *)view:视图只能有一个父视图。如果视图已经有一个超级视图并且该视图不是接收者,则此方法会在使接收者成为其新的超级视图之前删除先前的超级视图。
于 2012-08-16T18:59:43.593 回答
0

从我的角度来看,必须将相同的视图添加到不同的父视图(更重要的是,来自不同的视图控制器)表明设计存在问题......

但是,如果您真的(真的)需要,我一直认为一个视图实例可以有一个且只有一个父视图......此外,您可以通过[myView superview]消息访问它,它为您提供 UIView 实例而不是数组。 ..它可能会在添加到新的超级视图之前自动从其旧父级中删除?

关于设计,每次你需要一个新的并且有一个单例来管理他们的状态/逻辑时,如何创建它?

祝你好运!

于 2012-08-16T19:00:04.530 回答