我花了很多时间在这上面,但我找不到完美的解决方案。
我正在制作一个包含一堆项目的表格视图的应用程序。如果您单击一个项目,它会打开一个带有网页的 Webview 控制器,这个视图中有一个后退按钮。
我通过我制作的 API 获取这些项目的数据。这可能需要一些时间,因此在从 API 加载项目时我需要一个加载屏幕。但是,当项目同步并且上次同步时间不超过 X 时间时,它不应该执行 API 调用,而只是从 Core Data 中获取它(在 API 调用之后存储它)。
现在我正在为加载屏幕而苦苦挣扎。一些要求:
- 如果需要同步数据,应直接出现加载屏幕:
- 当应用程序启动时,或
- 当您单击 Webview 中的后退按钮时,或
- 应用程序被置于后台并以表视图作为活动视图重新出现在前台
- 如果数据不需要同步,表格视图应该直接出现在与上一点相同的情况下
- 从加载屏幕到 Table View 的过渡动画应该是 Cross Dissolve。
我打算让加载屏幕有一个带有一些照片的滑块,所以它不能只是一个叠加图像
我第一次尝试是这样的:
这里的加载屏幕是导航控制器之后的第一个视图。如果数据同步,我将 segue 调用到表视图(在 中viewWillAppear
)。如果数据未同步,它将等待直到同步。在viewWillAppear
Table View Controller 的方法中,我还检查是否需要完成同步(以防你从 Webview 回来,或者 App 进入前台),如果是,我调用[self.navigationController popViewControllerAnimated:NO]
(所以它会返回加载屏幕)。
这很好用,从 Webview 到加载屏幕的动画很流畅,我看不到中间的表格视图。但我不能修改动画,因为它是一个推动。所以我不能有溶解动画。
所以我尝试了一种不同的方法:
在这里我做了模态segues。在从表格视图到加载屏幕的一个上,我禁用了动画,在从加载屏幕到导航控制器的那个上,我给了 Cross Disolve 过渡。它需要回到导航控制器,否则我在表格视图中没有导航控制器。
在表格视图中,我再次检查数据是否需要同步,如果需要,则转到加载屏幕。但是,这次我需要这样做,viewDidAppear
因为加载屏幕尚未出现viewWillAppear
,当您将应用程序置于后台时,它会发出警告,等到 X 时间过去(因此它会同步)并将再次应用到前台。这是我得到的警告:
Warning: Attempt to present <BWLoadingScreenViewController: 0x829e2b0> on <UINavigationController: 0x856a6b0> whose view is not in the window hierarchy!
所以我使用viewDidAppear
并且我没有警告,但是,这种方法也有一个缺点:
- 当我从 Webview 返回并且 X 时间已经过去(所以它会同步)时,我看到推送动画首先进入表格视图,然后它闪烁到加载屏幕,非常丑陋......
现在我当然可以在所有地方使用手动转场,在每次转场之前检查数据是否需要同步,如果需要同步到加载屏幕而不是另一个,但是对于这么简单的事情来说,这将变得非常复杂,而且我还希望有一个通用的地方来检查是否需要完成同步并显示加载屏幕。
有没有人知道如何以一种干净利落的方式解决这个困境?非常欢迎提出建议。我对 iOS 开发还是很陌生,所以也许你可以给我一些新的见解。如果您想了解有关我的设置的更多信息,请询问我。