Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 创建同步时显示的加载屏幕,无延迟_Ios_Objective C_Cocoa Touch - Fatal编程技术网

Ios 创建同步时显示的加载屏幕,无延迟

Ios 创建同步时显示的加载屏幕,无延迟,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我在这方面花了很多时间,但我找不到一个完美的解决方案 我正在制作一个应用程序,它有一个包含大量项目的表视图。如果你点击一个项目,它会打开一个带有网页的Webview控制器,在这个视图中有一个后退按钮 我通过自己制作的API获取这些项目的数据。这可能需要一些时间,所以在从API加载项目时,我需要一个加载屏幕。但是,当项目被同步并且上次同步的时间不超过X时间时,它不应该执行API调用,而只是从核心数据(API调用后存储在那里)获取它 现在,我正在与加载屏幕挣扎。一些要求: 如果需要同步数据,则应直

我在这方面花了很多时间,但我找不到一个完美的解决方案

我正在制作一个应用程序,它有一个包含大量项目的表视图。如果你点击一个项目,它会打开一个带有网页的Webview控制器,在这个视图中有一个后退按钮

我通过自己制作的API获取这些项目的数据。这可能需要一些时间,所以在从API加载项目时,我需要一个加载屏幕。但是,当项目被同步并且上次同步的时间不超过X时间时,它不应该执行API调用,而只是从核心数据(API调用后存储在那里)获取它

现在,我正在与加载屏幕挣扎。一些要求:

  • 如果需要同步数据,则应直接显示加载屏幕:
    • 当应用程序启动时,或
    • 单击Webview中的backbutton时,或
    • 应用程序放在背景上,并以表视图作为活动视图显示在前景上
  • 如果不需要同步数据,则表视图应在与上一点相同的情况下直接显示
  • 从加载屏幕到表视图的过渡动画应为交叉融合
  • 我计划让加载屏幕有一个带有一些照片的滑块,所以它不能只是一个覆盖图像

    我第一次是这样尝试的:

此处,加载屏幕是导航控制器之后的第一个视图。如果数据同步,我调用segue到表视图(在
视图中将出现
)。如果数据未同步,它将等待直到同步。在表视图控制器的
视图将出现
方法中,我还检查是否需要进行同步(如果您从Webview返回,或应用程序进入前台),如果需要,我调用
[self.navigationController popViewControllerAnimated:NO]
(因此它返回到加载屏幕)

这很好,从Webview到加载屏幕的动画变得平滑,我看不到中间的表格视图。但是我不能修改动画,因为它是一个推送。所以我不能有溶解动画

所以我尝试了一种不同的方法:

在这里我做了模态分段。在从表格视图到加载屏幕的一个屏幕上,我禁用了动画,从加载屏幕到导航控制器的一个屏幕上,我给出了交叉分解转换。它需要返回到导航控制器,因为否则我在表视图中没有导航控制器

在表视图中,我再次检查数据是否需要同步,如果需要,则转到加载屏幕。但是,这一次我需要在
viewdide
中执行此操作,因为加载屏幕尚未出现在
viewwillbeen
中,当您将应用程序置于后台时,它会发出警告,等待X时间过去(因此它将同步),然后再次将应用程序置于前台。这是我得到的警告:

Warning: Attempt to present <BWLoadingScreenViewController: 0x829e2b0> on <UINavigationController: 0x856a6b0> whose view is not in the window hierarchy!
警告:尝试显示其视图不在窗口层次结构中的对象!
因此,我使用了
viewdideappear
,没有警告,但是,这种方法也有一个缺点:

  • 当我从Webview返回并且X时间已经过去(因此它将同步)时,我看到推送动画首先进入表格视图,然后它闪烁到加载屏幕,非常难看
现在我当然可以在所有地方使用手动分段,在每次分段之前检查数据是否需要同步,如果需要,则切换到加载屏幕而不是另一个屏幕,但对于这样一件简单的事情来说,这将变得非常复杂,我还希望有一个通用的地方,检查是否需要同步,并显示加载屏幕与否


有没有人知道如何以一种好的、干净的方式解决这个难题?欢迎提出建议。我对iOS开发还很陌生,所以也许你可以给我一些新的见解。如果您想了解有关我的设置的更多信息,请询问我。

您可以将加载屏幕(例如,
UIImageView
)直接添加到您的MasterViewController(需要是
UIViewController
而不是
UITableViewController
)并只需执行以下操作:

myImageView.hidden = NO;


取决于您是否从API获取数据。您还可以执行多个对象(例如添加
UIActivityIndicatorView

好的,我找到了一种方法

我发现你可以在推送的同时定制segue动画。借助这篇小文章:

基本上,您可以创建一个自定义segue类:

标题:

#import <UIKit/UIKit.h>

@interface BWLoadingScreenSegue : UIStoryboardSegue

@end
您需要将QuartzCore框架添加到您的链接框架中,以实现这一点。然后您可以选择segue,选择'Style'=“Custom”和'segue Class'=您的segue类名(上面有代码)。现在,由于方法
pushViewController
,它仍然是一个推送,并且由于
transition.type=kCATransitionFade这将是一个淡入淡出的过渡。非常好

您可以选择更多过渡,如:

kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
kCATransitionFade

我打算让我的加载屏幕成为一个带有一些照片的滑块,所以仅仅是一张图片是不行的
#import "BWLoadingScreenSegue.h"
#import "QuartzCore/QuartzCore.h"

@implementation BWLoadingScreenSegue

- (void)perform
{

    UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
    UIViewController *destinationController = (UIViewController*)[self destinationViewController];

    CATransition* transition = [CATransition animation];
    transition.duration = .25;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionFade;

    [sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [sourceViewController.navigationController pushViewController:destinationController animated:NO];

}

@end
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
kCATransitionFade