繁体   English   中英

使UIView更改其超级视图(或超级视图的超级视图)?

[英]Make a UIView change its superview (or superview's superview)?

我有四个UIViewviewA是根视图, viewB具有viewB作为其子视图。 viewBviewC作为其子视图和viewCviewD作为其子视图。 因此,存在四个视图的层次结构。 viewD基本上是一个可以点击以执行某项操作的按钮。 由于该操作与数据库有关,因此可能需要一段时间。 因此,我想要一个带有UIActivityIndicator不透明深色UIView ,以告诉用户稍等片刻,并防止其他可能引起麻烦的轻击操作。 但是,必须将暗视图放入viewA ,以使其覆盖整个屏幕。 这是我尝试(并成功)的方法,但我想知道是否有更简单的方法可以做到这一点。

  1. 通过viewAviewD.superview.superview.superview访问viewD 但是,它不是非常灵活,因为一旦更改了层次结构,此链就可能会更改。

  2. 使用委托。 viewD.delegate = viewA 然而, viewD通过创建viewC其通过创建(其直接上海华) viewB ,其通过创建viewA 所以,如果viewDviewCviewB@property其各自的超类(通过访问viewA.viewB.viewC.viewD是不可能的),那么viewA不能有一个指针viewD ,这将使代表团不可能的(据我明白)。

  3. 使用NSNotification 使viewD发布@"ActivityIndicatorShouldBePutOn"通知,并使viewA成为它的观察者。 但是, NSNotification用于广播吗? 因此有点不合适。

  4. 只要这种情况得以解决(在整个屏幕上都放置了黑色蒙版),我就可以使用与UIApplication相关的内容来访问屏幕并将其直接放在屏幕上。 但是,如果我只想出于其他目的将其放在屏幕的一部分上,那么它将无法正常工作。

因此,我想问一问是否有更好的方法或者上述一种方法是否是标准方法。

您可以将活动指示器视图添加到主窗口。 您可以使用以下方法获取keyWindow:

[[UIApplication sharedApplication] keyWindow];

我会推荐此API MBProgressHUD 它具有良好的外观和感觉,并且易于使用:

在此处输入图片说明

显示活动指示器

[MBProgressHUD showHUDAddedTo:self.view animated:YES];

移除它

[MBProgressHUD hideHUDForView:self.view animated:YES];

您可以使用选项3,即使它是广播节目,也只能由1个观察者收听。 然后每个UIView都有不同的通知

我会说这是最简单/有保证的修复,即使它可能不够优雅,也没有错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM