0

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

  1. viewA从访问。viewD_ viewD.superview.superview.superview但是它不是很灵活,因为一旦层次结构发生变化,这条链很可能会发生变化。

  2. 使用委托。viewD.delegate = viewA. 但是,viewDviewC(其直接超级视图)创建,由 创建viewB,由 创建viewA。因此,如果viewDviewCviewB@property属于其各自的超类(无法访问viewA.viewB.viewC.viewD),则viewA不能有指向 的指针viewD,这将使委托变得不可能(据我所知)。

  3. 使用NSNotification. viewD发布@"ActivityIndicatorShouldBePutOn"通知并viewA对其进行观察。但是,NSNotification是用来广播的吧?所以有点不合适。

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

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

4

3 回答 3

2

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

[[UIApplication sharedApplication] keyWindow];
于 2013-07-29T15:21:18.227 回答
2

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

在此处输入图像描述

显示活动指示器

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

删除它

[MBProgressHUD hideHUDForView:self.view animated:YES];
于 2013-07-29T15:39:12.000 回答
1

即使是广播,您也可以使用选项 3,您只需 1 个观察者即可收听。然后为每个 UIView 提供不同的通知

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

于 2013-07-29T15:21:12.593 回答