让UIView改变其超级视图(或superview的超级视图)?

时间:2013-07-29 15:16:30

标签: iphone ios objective-c

我有四个UIView s:viewA是根视图,vhich有viewB作为其子视图。 viewBviewC为子视图,viewCviewD为子视图。所以有四个视图的层次结构。 viewD基本上是一个可以点击进行操作的按钮。因为操作与数据库有关,所以可能需要一段时间。所以我想要一个黑色的不透明UIView,中间有一个UIActivityIndicator告诉用户等待片刻并防止其他可能导致麻烦的敲击动作。但是,必须将暗视图放在viewA中以使其覆盖所有屏幕。这是我尝试(并成功)但我想知道是否有更简单的方法来做到这一点。

  1. viewAviewD访问viewD.superview.superview.superview。但是它不是很灵活,因为一旦更改了层次结构,这个链很可能会被更改。

  2. 使用委托。 viewD.delegate = viewA。但是,viewDviewC(其直接超级视图)创建,viewBviewA创建,由viewD创建。因此,如果viewCviewB@property不是其相应超类的viewA.viewB.viewC.viewD(无法通过viewA进行访问),则viewD不能有指向NSNotification的指针,这将使代表团无法进行(据我所知)。

  3. 使用viewD。让@"ActivityIndicatorShouldBePutOn"发布viewA通知,并让NSNotification成为观察者。但是,UIApplication用于广播吗?所以这有点不合适。

  4. 只要这种情况发生(黑暗面具放在整个屏幕上),我就可以使用与{{1}}相关的东西来访问屏幕并将其直接放在屏幕上。但是,如果我只想将它放在屏幕的一部分用于不同的目的,那么这是行不通的。

  5. 所以我想问一下是否有更好的方法,或者上面提到的一种方法是否是标准方法。

3 个答案:

答案 0 :(得分:2)

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

[[UIApplication sharedApplication] keyWindow];

答案 1 :(得分:2)

我会推荐这个API MBProgressHUD。它具有良好的外观和感觉,易于使用:

enter image description here

显示activityIndi​​cator

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

删除它

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

答案 2 :(得分:1)

你可以使用选项3,即使它是一个广播,你可以只用一个观察者来听它。然后只为每个UIView提供不同的通知

我会说这是最简单/最有保障的修复,即使它可能不优雅,也没有任何问题。