UITabBar с UIWebView проблема с переключением представлений - PullRequest
0 голосов
/ 11 марта 2011

У меня есть приложение, которое имеет UITabBar с 5 представлениями, каждое из которых прикреплено к отдельному UIWebView. Каждый из WebViews отвечает на:

webViewDidStartLoad:(UIWebView *)webView
webViewDidFinishLoad:(UIWebView *)webView

Эти два отвечают за отображение экрана загрузки (отдельное изображение для каждой вкладки, видимый или нет) и индикатора активности.

Все отлично работает, когда страница загружается в WebView. Пользователь нажимает на ссылку на странице, изображение загрузки отображается вместе с индикатором активности. Когда страница загружена, они оба исчезают, и появляется новый веб-сайт.

Проблема в том, что пользователь нажимает на один из элементов TabBar. Приложение перехватывает событие и запускает метод в соответствующем представлении, который обновляет страницу.

Проблема: после того, как вид касания немедленно переключается на другой WebView, однако экран загрузки занимает много времени (из того, что я понял, он показывает, только когда страница, переданная в homeView, начинает загружаться), и я не могу понять, Зачем. Отображение элементов загрузки - это первое, что приложение должно сделать после вызова метода.

Вот код, который вызывает метод из контроллера TabBar:

[hv performSelector:@selector(goToPage) withObject:nil afterDelay:0.0];

а вот метод goToPage:

- (void) goToPage
{
    homeView.delegate = self;

    self.showLoading;

    NSURL *url = [NSURL URLWithString: [NSString stringWithFormat: @"%@/seed.php", appURL]];
    NSString *body = [NSString stringWithFormat: @"uid=%@", uID];
    NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
    [request setHTTPMethod: @"POST"];
    [request setHTTPBody: data];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    [request release];
    NSString *seedString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    NSArray *seedArray = [seedString componentsSeparatedByString:@":::"];

    NSString *eventNumber = [[seedArray objectAtIndex:0] retain];
    NSString *passedSid = [[seedArray objectAtIndex:1] retain];

    if (!seedString) {
        // can't connect
        NSLog(@"Can't connect.");
    }else {
        // connected
        NSLog(@"Events: %@", eventNumber);
        if(![evtNo isEqualToString:eventNumber]){
            evtNo = eventNumber;
            if(![evtNo isEqualToString:@"0"]){
                AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
            }
        }
    }

    NSURL *urlView = [NSURL URLWithString: [NSString stringWithFormat: @"%@/index.php", appURL]];
    NSString *bodyView = [NSString stringWithFormat: @"sid=%@", passedSid];
    NSData *dataView = [bodyView dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableURLRequest *requestView = [[NSMutableURLRequest alloc]initWithURL:urlView];
    [requestView setHTTPMethod: @"POST"];
    [requestView setHTTPBody: dataView];
    [homeView loadRequest: requestView];

    if([evtNo isEqualToString:@"0"]){
        // clearing badge
        [[[[[self tabBarController] viewControllers] objectAtIndex: 0] tabBarItem] setBadgeValue: nil];
    }else{
        [[[[[self tabBarController] viewControllers] objectAtIndex: 0] tabBarItem] setBadgeValue: evtNo];
    }
}

Цель, которую я имею, состоит в том, чтобы отобразить загрузочное изображение в тот момент, когда пользователь нажимает на элемент TabBar, и оставаться видимым до тех пор, пока страница не перестанет загружаться.

1 Ответ

0 голосов
/ 09 июля 2011

Решением этой проблемы было запустить метод goToPage без задержки, отобразить экран загрузки в goToPage и переместить трудоемкие биты в другой метод внутри этого класса, запущенный с использованием persormSelector.

...