在ios uiwebview objective-c中检查布尔值是yes还是no时出错

Posted

技术标签:

【中文标题】在ios uiwebview objective-c中检查布尔值是yes还是no时出错【英文标题】:error while checking if boolean value is yes or no in ios uiwebview objective-c 【发布时间】:2018-11-16 14:44:33 【问题描述】:

我正在尝试检查在 ios UIWebView 中加载的 URL 是否有错误,如果 200 我想将 isRequestWebOk 设置为 YES ,我将使用以下代码获取请求 url 状态代码将使用默认的NO,除了isRequestWebOk 仍然返回NO,即使状态码是200 并且我确实设置了它if(200)isRequestWebOk = YES;,一切似乎都运行良好。 请任何人帮助我,我不知道为什么不能正常工作。

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType
    static BOOL isRequestWeb = YES;
    static BOOL isRequestWebOk = NO;
    NSString *embedhtml = @"<html><head></head><body style='color:#000;'><p>Error</p></body></html>";

    if (isRequestWeb) 
        //NSHTTPURLResponse *response = nil;
        //NSData *data = [NSURLConnection sendSynchronousRequest:inRequest returningResponse:&response error:nil];
        //if (response.statusCode == 404) 

        [[[NSURLSession sharedSession] dataTaskWithRequest:inRequest completionHandler:^(NSData * data, NSURLResponse * response, NSError * error) 
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            NSInteger statusCode = httpResponse.statusCode;
            if (statusCode >= 200 && statusCode < 300)
                /*I think this do set but i can't access it outside the completionHandler but i really need to check it outside as i cannot do many other things inside here*/
                isRequestWebOk = YES;
                NSLog(@"GOOD");
            else if (statusCode == 404) 
                NSLog(@"code for 404");
            else if (statusCode == 403) 
                NSLog(@"code for 403");
            else if (statusCode == 500) 
                NSLog(@"code for 500");
            else
                NSLog(@"code for ALL");
                isRequestWebOk = YES;
            
            NSLog(@"code is what: %ld", (long)statusCode);
        ] resume];
        isRequestWeb = NO;

        /*This is where am checking for isRequestWebOk if true or not but it always return false*/
        if(isRequestWebOk)
            NSLog(@"Request is okay 200");
            return YES;
        else
            NSLog(@"Bad Request b4004");
            inWeb.userInteractionEnabled = NO;
            inWeb.opaque = NO;
            inWeb.backgroundColor = [UIColor clearColor];
            [inWeb loadHTMLString: embedHTML baseURL: nil];
            return NO;
        
    
    return YES;

我认为这确实设置了,但我无法在 completionHandler 之外访问它,但我真的需要在外面检查它,因为我无法在里面做很多其他事情

【问题讨论】:

欢迎来到异步编程。当您的完成处理程序被执行时,-webView:shouldStartLoadWithRequest:navigationType: 已经完成并且您的检查已经使用原始值执行。处理程序是一个块,稍后会被复制并执行,因此是异步的。 此外,WebKit 会询问您是否应该执行请求。为什么要加载请求,然后再决定是否加载? 【参考方案1】:

你需要移动这段代码:

if(isRequestWebOk)
    NSLog(@"Request is okay 200");
    return YES;
else
    NSLog(@"Bad Request b4004");
    inWeb.userInteractionEnabled = NO;
    inWeb.opaque = NO;
    inWeb.backgroundColor = [UIColor clearColor];
    [inWeb loadHTMLString: embedHTML baseURL: nil];
    return NO;

completionHandler里面。

当您在此处检查isRequestWebOkYES 还是NO 时,请求可能仍在进行中。

【讨论】:

这样做我会收到警告Thread 10: EXC_BREAKPOINT (code=1, subcode=0x1f25e5508)-[UIWebView setOpaque:] must be used from main thread only,我还有其他代码将在其中使用,可能会导致更多错误 您可以保留 Mo 的解决方案,但只需通过调度到主线程来更新 UI 元素。 问题是他想通过加载数据和检查结果来决定是否加载数据。

以上是关于在ios uiwebview objective-c中检查布尔值是yes还是no时出错的主要内容,如果未能解决你的问题,请参考以下文章

在ios uiwebview objective-c中检查布尔值是yes还是no时出错

以编程方式在iOS上滚动UIWebView

我们可以在 iOS 上使用 UIWebView 打开 pdf 文件吗?

我们可以在iOS上使用UIWebView打开pdf文件吗?

我们可以在iOS上使用UIWebView打开pdf文件吗?

iOS“默认”UIWebView/WebKit 上的 WebAudio 支持