Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 iPhone应用程序:避免启动屏幕后出现白色屏幕。让启动画面停留,在UIWebview加载后隐藏它?启动屏幕未正确隐藏_Ios_Objective C_Iphone_Uiwebview - Fatal编程技术网

Ios iPhone应用程序:避免启动屏幕后出现白色屏幕。让启动画面停留,在UIWebview加载后隐藏它?启动屏幕未正确隐藏

Ios iPhone应用程序:避免启动屏幕后出现白色屏幕。让启动画面停留,在UIWebview加载后隐藏它?启动屏幕未正确隐藏,ios,objective-c,iphone,uiwebview,Ios,Objective C,Iphone,Uiwebview,对于iPhone应用程序,我们的目标很简单:当UIWebview准备好显示其页面时,显示启动页面,然后隐藏它 我们需要在UIWebview准备好显示之前保留默认启动屏幕。否则,将短暂显示一个白色屏幕 不幸的是,闪屏在我们让它停留后无法隐藏。默认启动屏幕保持可见,将UIWebview隐藏在下面 我们理解这可能违反苹果的指导方针 这更像是一个原型,我们想知道我们做错了什么。有什么线索吗 我们使用的是Xcode 4.2 AppDelegate.m: ViewController.m: Curret V

对于iPhone应用程序,我们的目标很简单:当UIWebview准备好显示其页面时,显示启动页面,然后隐藏它

我们需要在UIWebview准备好显示之前保留默认启动屏幕。否则,将短暂显示一个白色屏幕

不幸的是,闪屏在我们让它停留后无法隐藏。默认启动屏幕保持可见,将UIWebview隐藏在下面

我们理解这可能违反苹果的指导方针

这更像是一个原型,我们想知道我们做错了什么。有什么线索吗

我们使用的是Xcode 4.2

AppDelegate.m: ViewController.m: Curret ViewController.m生成错误:

//
//  ViewController.m
//  Stroll
//
//  Created by Macintosh User on 6/4/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "AppDelegate.h"
#import "ViewController.h"

@implementation ViewController

@synthesize splash;

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
    UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];

    webView.delegate = self;

    [webView setBackgroundColor:[UIColor clearColor]];
    NSString *urlAddress = @"http://www.cnn.com";
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];

    for (id subview in webView.subviews)
        if ([[subview class] isSubclassOfClass: [UIScrollView class]])
            ((UIScrollView *)subview).bounces = NO;

    /*
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    UIImageView *imageView = appDelegate.imgv;
    [imageView removeFromSuperview];
    [imageView setHidden:YES];
    imageView = nil; */

    [self.view addSubview:webView];
    [self.view bringSubviewToFront:webView];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"Done loading UIWebView");
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        self.view.userInteractionEnabled = NO;

        splash = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];

        splash.image = [UIImage imageNamed:@"Default.png"];
        [self.view addSubview:splash];
    });
}

-(void) webViewDidFinishLoad:(UIWebView *)webView {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [splash removeFromSuperView];
    });
}

@end

默认情况下,Default.png用作splashscreen,然后自动删除。但是,您可以创建另一个实例,并自己将其放置到视图中。删除这部分代码

imgv = [[UIImageView alloc] init];
[imgv setImage:[UIImage imageNamed:@"Default.png"]];
[imgv setFrame:CGRectMake(0, 0, 320, 480)];
[self.window addSubview:imgv];

从您的
应用程序:didFinishLaunchingWithOptions:
方法这里有一种实现方法,首先去掉AppDelegate中的所有代码。在根视图控制器中添加一个名为“splash”的UIImageView类实例变量

现在在rootViewController.m中:

-(void) viewWillAppear:(BOOL) animated {

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        self.view.userInteractionEnabled = NO;

        splash = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];

        splash.image = [UIImage imageNamed:@"Default.png"];
        [self.view addSubview:splash];
    });
    }
现在在webView中加载完成回调方法/块

static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{

          [splash removeFromSuperView];
        });
因此,dispatch_once确保该方法在应用程序的生命周期内运行一次,并且只运行一次

编辑:

要获取您的回拨:

在viewController.h->viewC:UIViewController

在viewController.m中

-(void) viewDidLoad{

    CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
    UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];

    webView.delegate = self;

    [webView setBackgroundColor:[UIColor clearColor]];
    NSString *urlAddress = @"http://www.cnn.com";
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];
}
然后


[第一视图控制器.m]

启动屏幕没有消失的原因是,在将启动屏幕添加到屏幕窗口之前,调用了ViewController中的ViewDidLoad

具体来说,ViewDidLoad方法是在[self.window makeKeyAndVisible]附近调用的,就在调用splash之前

[第二视图控制器.m]

您可能不想在此处添加闪屏,因为有两个原因:1)在ViewWillDisplay中,可能尚未创建视图;2)视图将出现:可以多次调用您可能并不真正想要的视图

[可行的方法]

一个可行的方法(我正在使用的)是你的第一次和第二次试验的结合。我是说

  • 将启动屏幕添加到AppDelegate中的窗口
  • 执行一些后台任务以获取数据(例如,或加载webview)
  • 任务完成后,发布通知。注册到TaskDoneNotification的启动屏幕将进行必要的清理,并从其superview中删除自身
    完成

    对不起,我们需要澄清。我们希望启动屏幕保持不变,以避免出现在启动屏幕消失(默认情况下)和UIWebview渲染之间的白色屏幕。所以我们需要这个代码保持不变。我们对Objective-C是新手:我们没有rootViewController。m。。。你是说ViewController.m吗?谢谢另外,UIWebview的加载完成回调方法是什么?根视图控制器指的是应用程序启动时加载的第一个视图,请查看UIWebViewDelegate-(它有一个名为webViewDidFinishLoad:)的方法。因此,如果我们只有一个ViewController.m,那么您的第一个代码块就会出现在那里?请参阅编辑,在尝试创建初始屏幕之前,您应该阅读并了解有关视图控制器、委托和回调的更多信息,以供将来参考。闪屏应该是你最不应该担心的:)哇,这是因为removeFromSuperView应该是removeFromSuperView.:)谢谢您的回答,但是您如何注册和捕获通知?我们的应用程序主要是作为一个web应用程序,因此对Objective-C的接触有限(并避免PhoneGap,因为我们只需要在应用程序中显示一个网页)。@Crashalot,您可以参考NSNotificationCenter类参考,这只是一个提醒,当您处理启动视图时,请记住作为观察者删除它
    static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
    
              [splash removeFromSuperView];
            });
    
    -(void) viewDidLoad{
    
        CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
        UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];
    
        webView.delegate = self;
    
        [webView setBackgroundColor:[UIColor clearColor]];
        NSString *urlAddress = @"http://www.cnn.com";
        NSURL *url = [NSURL URLWithString:urlAddress];
        NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
        [webView loadRequest:requestObj];
    }
    
    -(void) webViewDidFinishLoad:(UIWebView *)webView {
    
        static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
    
              [splash removeFromSuperView];
            });
    }