我有四个UIView
s:viewA
是根视图,vhich有viewB
作为其子视图。 viewB
以viewC
为子视图,viewC
以viewD
为子视图。所以有四个视图的层次结构。 viewD
基本上是一个可以点击进行操作的按钮。因为操作与数据库有关,所以可能需要一段时间。所以我想要一个黑色的不透明UIView
,中间有一个UIActivityIndicator
告诉用户等待片刻并防止其他可能导致麻烦的敲击动作。但是,必须将暗视图放在viewA
中以使其覆盖所有屏幕。这是我尝试(并成功)但我想知道是否有更简单的方法来做到这一点。
viewA
从viewD
访问viewD.superview.superview.superview
。但是它不是很灵活,因为一旦更改了层次结构,这个链很可能会被更改。
使用委托。 viewD.delegate = viewA
。但是,viewD
由viewC
(其直接超级视图)创建,viewB
由viewA
创建,由viewD
创建。因此,如果viewC
,viewB
和@property
不是其相应超类的viewA.viewB.viewC.viewD
(无法通过viewA
进行访问),则viewD
不能有指向NSNotification
的指针,这将使代表团无法进行(据我所知)。
使用viewD
。让@"ActivityIndicatorShouldBePutOn"
发布viewA
通知,并让NSNotification
成为观察者。但是,UIApplication
用于广播吗?所以这有点不合适。
只要这种情况发生(黑暗面具放在整个屏幕上),我就可以使用与{{1}}相关的东西来访问屏幕并将其直接放在屏幕上。但是,如果我只想将它放在屏幕的一部分用于不同的目的,那么这是行不通的。
所以我想问一下是否有更好的方法,或者上面提到的一种方法是否是标准方法。
答案 0 :(得分:2)
您可以将活动指示器视图添加到主窗口。您可以使用以下命令获取keyWindow:
[[UIApplication sharedApplication] keyWindow];
答案 1 :(得分:2)
我会推荐这个API MBProgressHUD。它具有良好的外观和感觉,易于使用:
显示activityIndicator
[MBProgressHUD showHUDAddedTo:self.view animated:YES];
删除它
[MBProgressHUD hideHUDForView:self.view animated:YES];
答案 2 :(得分:1)
你可以使用选项3,即使它是一个广播,你可以只用一个观察者来听它。然后只为每个UIView提供不同的通知
我会说这是最简单/最有保障的修复,即使它可能不优雅,也没有任何问题。