UITableViewController 中的 UIActivityIndi​​catorView 与 UITableView 在同一层次结构中

UIActivityIndicatorView in the same hierarchy of UITableView in UITableViewController

我有一个 UIViewController,我在同一层次结构中删除了一个 UITableView 和 UIActivityIndi​​catorView,它工作正常。

但是我有一个 UITableViewController,当然有一个 UITableView,我试着删除一个 UIActivityIndi​​catorView 与 Table 视图处于同一层次结构,但没有运气。我知道 UITableViewController 和 UIViewController 与 Table 视图有问题,但如何解决?

这两个屏幕截图将有助于理解问题。

我想要的样子:

结果:

问题是 UIViewController 它有一个 self.view 作为根视图,您可以在其中添加任何子项目,至少在以 UITableViewController 作为根视图的 IB 是 table 本身

第一种方式

将其添加到代码中,控件在 table视图滚动时的位置,因此在 scrollViewDidScroll 中更改其框架,使其在加载期间保持在屏幕中央

第二种方式

将其添加到应用程序的主要 window 并在加载完成后将其删除

当您拖放任何视图时(无论是 UILabelUIActivityIndi​​catorViewUIView),

如果它 在您放置的单元格 之上,它将被自动视为 TableViewHeader

如果它低于你放在那里的单元格,它将被自动视为 TableViewFooter

这就是为什么它们处于同一单元格视图层次结构级别的原因。

如果您真的想在 tableViewController 中使用与 tableView 相同级别的 indicatorView,即使您以编程方式创建它并将其添加到 tableviewcontroller ] 的 self.view,它 不会 工作,因为 tableViewControllerself.view 是它的内容视图,它无论如何都是可滚动的,有点一个无赖。我们只能完全控制 UIViewController.

好的,伙计们,我找到了另一种解决方案。

在里面定义一个变量UITableViewController

weak var spinner: UIActivityIndicatorView!

然后在 viewDidLoad 方法中进行此操作(希望代码不言自明)

let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray)
tableView.backgroundView = activityIndicatorView
tableView.separatorStyle = .none
self.spinner = activityIndicatorView

然后在需要显示的时候调用spinner.startAnimating()

self.spinner.stopAnimating()
self.tableView.separatorStyle = .singleLine

在不需要时删除它。