Objective c 在appDelegate init方法中启动self.window

Objective c 在appDelegate init方法中启动self.window,objective-c,xcode,cordova,Objective C,Xcode,Cordova,我是一名创建ApacheCordova应用程序的web开发人员,因此我对Objective-C的了解很少。一切都很顺利,直到我尝试用视频补充启动屏幕。有点像,但不是完全。。首先显示Default.png,然后显示SplashScreenLoader。然后它会播放视频,我知道这一点,因为音频会发出,但视频层不会显示 我发现self.window或self.viewController都是在didFinishLaunchingWithOptions中定义的,因此它们在-(id)init方法中不存在。

我是一名创建ApacheCordova应用程序的web开发人员,因此我对Objective-C的了解很少。一切都很顺利,直到我尝试用视频补充启动屏幕。有点像,但不是完全。。首先显示Default.png,然后显示SplashScreenLoader。然后它会播放视频,我知道这一点,因为音频会发出,但视频层不会显示

我发现self.window或self.viewController都是在didFinishLaunchingWithOptions中定义的,因此它们在-(id)init方法中不存在。因此,我找不到一种方法将其放置在装载飞溅物的顶部

我的init方法当前在AppDelegate.m中看起来像这样:

- (id) init {   

NSString *moviePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Splash_v1.mp4"];
 NSURL *movieURL = [NSURL fileURLWithPath:moviePath];

 MPMoviePlayerController* moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
 moviePlayer.controlStyle = MPMovieControlStyleNone;
 [moviePlayer.view setFrame: self.window.bounds];
 [self.window addSubview:moviePlayer.view];
 [self.window makeKeyAndVisible];
 [moviePlayer play];


NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

[CDVURLProtocol registerURLProtocol];

return [super init];
}

这里self.window为null,我还尝试使用以下代码设置self.window:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];
…没有胜利。它实际上设置了它,但对于后续代码,它不想这样做

所以我想知道的是,在使用选项完成启动之前,我如何将此视频放在splash的内容之上

提前感谢,, //彼得

所以我想知道的是,在使用选项完成启动之前,我如何将此视频放在splash的内容之上

实际上,您可以在
中使用选项完成启动。将这些语句放在那里(在Xcode为您生成的bolierplate代码中,您应该已经调用了
makeKeyAndVisible
,所以只需对其进行补充即可):

之前已经实例化了你的电影播放器

避免空白屏幕的一种方法可能是:

  • 创建包含默认.png图像的UIImageView

  • 通过将UIImageView作为子视图添加到self.window中来显示该UIImageView(这不会产生黑屏效果)

  • 初始化你的播放器(我认为这需要一些时间,因此会出现黑屏)并将其添加到UIImageView下面

  • 当播放器准备就绪(
    viewDidLoad
    )时,将其推到UIImageView的顶部

  • 最后,我不知道您的播放器将如何发出视频播放结束的信号,但我假设您有一些委托方法;让您的appDelegate也成为您的播放器代理,然后从self.window中删除UIImageView和player,并将其他视图添加到self.window中

    希望这有帮助

    编辑:

    这是我将尝试在您的应用程序中执行的操作的大致草图委托appDidFinishLaunching:

    self.moviePlayer = <INIT MOVIEW PLAYER CONTROLLER>
    self.backgroundImage = <INIT UIImageView with Default.png>
    
    [self.window addSubview:self.moviePlayer.view];
    [self.window addSubview:self.backgroundImage];
    [self.window makeKeyAndVisible];
    

    如果这对其他人有帮助的话,我也遇到了同样的问题,通过移动“[self.windowmakeyAndVisible];”解决了这个问题在子视图上方,如下所示,因此在appdelegate.m中:

    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
    myView.backgroundColor = [UIColor blueColor];
    
    [self.window makeKeyAndVisible];
    [self.window addSubview:myView];
    

    这很好,但是如果我交换最后两条语句,子视图将不会显示。

    谢谢您的快速回复。。我试着把它放在那里,但是它提出了另外两个问题,我希望通过早些时候发布视频来绕过它们。一个是它在视频开始前会出现一个黑屏,另一个是我还没有弄清楚如何收听已完成的事件,并在此时使用[self.window addSubview:self.viewController.view]切换到应用程序的内容;不幸的是,
    AppDidFinishLaunchwithOptions
    是您的应用程序入口点。几分钟后看我的编辑,了解关于另外两个问题的一些想法…很抱歉回复晚了Sergio,谢谢你为我指出了正确的方向。因此,在appDidFinishLaunchingWithOptions中播放时,似乎只有一个[self.window addSubview:…]可以在此处显示,但是我将一个BringSubview放置到了前面。因此,如果我创建一个UIImageView(稍后可以粘贴代码),它可以设置它,但随后尝试使用[self.window addSubview:self.viewController.view]完成该方法(也为此尝试了bringSubviewToFront)然后我不知道如何处理viewDidLoad中的代码,以便从appDidFinishLaunchingWithOptions访问视图;既不是self.window也不是self.viewController.view。。都是可访问的。。当你说要将一个视图推到另一个视图上时,在任何情况下都是通过将SubViewToFront带到另一个视图上来完成的?你应该发布更多的代码,否则我不知道我在评论什么。。。无论如何,请看我的编辑。。。
    - (void)viewDidLoad {
        [super viewDidLoad];
        ...
        [self.view.superview addSubview:self.view]; //-- this will just move the player view to the top
        ...
    }
    
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
    myView.backgroundColor = [UIColor blueColor];
    
    [self.window makeKeyAndVisible];
    [self.window addSubview:myView];