[英]Make a UIView change its superview (or superview's superview)?
我有四个UIView
: viewA
是根视图, viewB
具有viewB
作为其子视图。 viewB
有viewC
作为其子视图和viewC
已viewD
作为其子视图。 因此,存在四个视图的层次结构。 viewD
基本上是一个可以点击以执行某项操作的按钮。 由于该操作与数据库有关,因此可能需要一段时间。 因此,我想要一个带有UIActivityIndicator
不透明深色UIView
,以告诉用户稍等片刻,并防止其他可能引起麻烦的轻击操作。 但是,必须将暗视图放入viewA
,以使其覆盖整个屏幕。 这是我尝试(并成功)的方法,但我想知道是否有更简单的方法可以做到这一点。
通过viewA
从viewD.superview.superview.superview
访问viewD
。 但是,它不是非常灵活,因为一旦更改了层次结构,此链就可能会更改。
使用委托。 viewD.delegate = viewA
。 然而, viewD
通过创建viewC
其通过创建(其直接上海华) viewB
,其通过创建viewA
。 所以,如果viewD
, viewC
和viewB
不@property
其各自的超类(通过访问viewA.viewB.viewC.viewD
是不可能的),那么viewA
不能有一个指针viewD
,这将使代表团不可能的(据我明白)。
使用NSNotification
。 使viewD
发布@"ActivityIndicatorShouldBePutOn"
通知,并使viewA
成为它的观察者。 但是, NSNotification
用于广播吗? 因此有点不合适。
只要这种情况得以解决(在整个屏幕上都放置了黑色蒙版),我就可以使用与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.