Загрузить HTML NSString в UIWebView - PullRequest
       19

Загрузить HTML NSString в UIWebView

0 голосов
/ 27 октября 2010

Я делаю проект, где я подключаюсь к веб-странице, используя NSURLConnection, чтобы иметь возможность отслеживать возвращаемые коды состояния (200 OK / 404 ОШИБКА).Я хотел бы отправить пользователя на верхний URL-адрес www.domain.com, если я получу код 404 в качестве кода состояния и если я получу код статуса 200, я бы хотел загрузить страницу в веб-просмотр.Я видел несколько реализаций этой проблемы, создавая новый запрос, но я чувствую, что это не нужно, поскольку вы уже получили html в первом запросе, поэтому я просто хотел бы загрузить этот HTML-код в webView.

Поэтому я пытаюсь использовать [webView loadHTMLFromString: baseURL:], но это не всегда работает, я заметил, что когда я печатаю строку NSString с html в connectionDidFinnishLoading, она иногда равна нулю, и когда я наблюдаю за этимиВ случаях, при печати html в didReceiveData, случайное число последних пакетов равно NULL (отличается от 2-10).Это всегда одни и те же веб-страницы, которые не загружаются.Если я загружаю их в свой webView, используя [webView loadRequest: myRequest], это всегда работает.Моя реализация выглядит так, что, возможно, кто-то из вас может увидеть, что я делаю неправильно.

Я создаю свой первый запрос с помощью нажатия кнопки.

-(IBAction)buttonClick:(id)sender
{
    NSURL *url = [NSURL URLWithString:@"http://www.domain.com/page2/apa.html"];
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url]
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    if( theConnection )
    {
        webData = [[NSMutableData data] retain];
    }
    else
    {

    }
}

Затем я отслеживаю код ответа в didReceiveResponseметод, приведя запрос к NSHTTPURLResponse, чтобы иметь возможность доступа к кодам состояния, а затем установив Bool в зависимости от кода состояния.

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{     
    NSHTTPURLResponse *ne = (NSHTTPURLResponse *)response;
    if ([ne statusCode] == 200) {
        ok = TRUE;
    }

    [webData setLength: 0];
}

Затем я проверяю значение bools в connectionDidFinnishLoading.Если я регистрирую HTML-строку NSString, я получаю источник веб-страницы, поэтому я знаю, что это не пустая строка.

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSString *html = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:@"http://www.domain.com/"];
    if (ok) {
        [webView loadHTMLString:html baseURL:url];
        ok = FALSE;
    }
    else {
        // Create a new request to www.domain.com
    }

}

webData - это переменная экземпляра, и я загружаю ее в didReceiveData следующим образом.

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [webData appendData:data];
}

Ответы [ 2 ]

0 голосов
/ 28 октября 2010

Я предполагаю, что webData является переменной экземпляра в вашем классе.Я думаю, что ваша проблема в том, что вы не устанавливаете webData для данных, которые вы получаете от NSURLConnection.Попробуйте что-то вроде этого:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [webData appendData:data];
}

Если это не поможет, попробуйте добавить NSLog() после строки NSString *html = [[NSString alloc]..., например:

NSLog(@"HTML: %@", html);

Это сообщит вам, получаете ли вы HTML или нет, и связана ли проблема с вашим NSURLConnection кодом или UIWebView IBOutlet.

0 голосов
/ 28 октября 2010

Вы смешиваете два способа подключения - синхронный и асинхронный. Если асинхронный завершается раньше синхронного, вы инициализируете webData в пустую строку. Так что даже если синхронно заполнено webData, оно будет очищено.

// you create asynchronous connection which starts downloading in background immediately
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
// you create another synchronous connection which will block until the URL is downloaded
[NSURLConnection sendSynchronousRequest:theRequest returningResponse: &responseHeader error: nil];

// assuming your theRequest is valid, theConnection is always non-nil, so this is always TRUE
if (theConnection) {
     // you reset content of webData, so if your synchronous connection has downloaded something, you throw it away here
     webData = [[NSMutableData data] retain];
} else ...

Попробуйте удалить ненужный / глючный вызов на sendSynchronousRequest:returningResponse:error:, и он может сработать.

В любом случае - где вы заполняете webData данными? Вы реализовали connection:didReceiveData: и добавили то, что входит в webData, верно? Если вы не ... ну, это проблема, которую вы видите.

...