2013-02-26 2 views
3

UIWebView의 goBack 기능에 문제가 있습니다.UIWebView go 특정 페이지로 돌아 가기

내 요구 사항은 사용자가 버튼 ("뒤로 버튼")을 누르면 특정 조건에서 특정 페이지로 사용자를 리디렉션해야합니다. "카트 시스템"이라고 생각하십시오 : 사용자가 "메뉴"페이지에있을 때 그는 항목을 선택하고 "장바구니에 항목 추가"를 선택하십시오. 그가 "항목 제거"를 클릭하면 "항목이 제거되었습니다"페이지로 이동합니다. 사용자가 "뒤로 버튼"을 클릭하면 빈 카트 페이지 대신 "메뉴"로 돌아 가야합니다.

이 문제를 해결하기 위해 "큐"를 사용하여 URL 기록을 저장 한 다음 특정 조건에서 "뒤로 단추"를 누른 다음 "대기열"에서 URL을 다시로드합니다.

나는 this answer 덕택에 대기열에 넣기/빼기 기능으로 맞춤 NSMutableArray를 만들었습니다. 지금은 성공적으로 "delBackPage"를 얻을 수

- (void) backWebView:(id)sender 
{ 

    currentURL = [[_webView request] URL]; 
    NSString *currentTGTName = [self getTargetURLName:currentURL]; 

    if ([_webView canGoBack]) 
    { 
     if ([currentURL isEqual:[[_webView request] URL]]) 
     { 
      if ([currentTGTName isEqualToString:@"my_cart"] && delBackPage != nil) { 
       NSLog(@"GO BACK FROM MY_CART: %@", delBackPage); 
       _requestURL = delBackPage; 
       [_webView reload]; 
      } else { 
       [_webView goBack]; 
       NSLog(@"WEBVIEW CANGOBACK----"); 
      } 
     } 
    ... 

:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    _currentPage = [[request URL] absoluteString]; 
    NSString *targetURL = [self getTargetURLName:[request URL]]; 

    if ([webViewHistory count] > 5) { 
     [webViewHistory dequeue]; 
     [webViewHistory enqueue:_currentPage]; 
    } else { 
     [webViewHistory enqueue:_currentPage]; 
    } 
    if ([targetURL isEqualToString:@"delete_cart"]) { 
     delBackPage = [webViewHistory objectAtIndex:2]; 
     NSLog(@"URL BEFORE DELETE: %@", delBackPage); 
    } 
} 

는 그런 다음 "뒤로 버튼은"특정 조건에서 누를 때이 "다시로드"전화 : 그런 다음 URL의 기록을 저장하는 데 사용 "메뉴"페이지의 URL 하지만 WebView를 해당 URL로 다시로드하면 작동하지 않습니다.

내가 누락 된 항목이 있습니까? 이것을 달성 할 수있는 방법이 있습니까? WebView의 URL을 제어하는 ​​더 좋은 방법이 있다면 매우 감사하겠습니다.

편집 크리스의 팁

덕분에, 우리는 마침내 같은 "뒤로 버튼"을 제어 관리하는 다음

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    url = [[request URL] absoluteString]; 

    // Store the conditions 
    if ([url rangeOfString:[NSString stringWithFormat:@"%@orders/my_cart", SITE_URL]].location != NSNotFound || 
     [url rangeOfString:[NSString stringWithFormat:@"%@orders/add_cart", SITE_URL]].location != NSNotFound) { 
     if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/top", SITE_URL]].location != NSNotFound || 
      ...) { 
     ref = currentURLStr; 
     } 
    } 

    currentURLStr = url; 
    return YES; 
} 

그리고 "뒤로 버튼을"...

- (void) backWebView:(id)sender 
{ 
    if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/top", SITE_URL]].location != NSNotFound || 
     [currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/error", SITE_URL]].location != NSNotFound) 
    { 
     [[self navigationController] popViewControllerAnimated:YES]; 

    } else if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/genre", SITE_URL]].location != NSNotFound || 
       ....) { 
     [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@orders/top/%@/%@", SITE_URL, guid, authKey]]]]; 

    // Refer the stored conditions... 
    } else if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/my_cart", SITE_URL]].location != NSNotFound) { 

     if ([ref rangeOfString:[NSString stringWithFormat:@"%@orders", SITE_URL]].location != NSNotFound) { 
      [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:ref]]]; 
      ref = @""; 
     } else { 
      [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@orders/top/%@/%@", SITE_URL, guid, authKey]]]]; 
     } 

    } else { 

     if (![_webView canGoBack]) { 
      [[self navigationController] popViewControllerAnimated:YES]; 
     } else { 
      [_webView goBack]; 
     } 
    } 
} 

이 접근법이 모두 유사한 문제에 직면하는 데 도움이되기를 바랍니다.

답변

1

앱의 웹 페이지 간 이동을보다 세부적으로 제어하려는 경우처럼 들리지만 표준의 뒤로/앞으로 기능은 작동하지 않습니다.

나는 완전히 무시함으로써 문제를 단순화 추천하여 UIWebView에서 goBackgoForward 기능을 내장하고 버튼은 "에서 StateManager"타입 객체에 위임해야 - 현재 응용 프로그램의 상태와 어떤 사용자 방향을 기준으로 (즉, 어떤 페이지를로드해야하는지) 알 수 있습니다.

새 상태를로드하려면 [_webView loadRequest:request] (또는 다른로드 함수 중 하나 - 아래 참조)을 사용하십시오. 여기서 request은 새 상태를 나타냅니다.

내가 _requestURL 위 코드에서 사용되는 표시되지 않습니다,하지만 [_webView reload]를 호출하면 바로있는 UIWebView로드 기능 중 하나 (예 : loadData, loadHTMLString, 또는 loadRequest)를 통해로드 된 마지막 페이지로드, 또는 나중에 탐색 된 마지막 페이지는 (링크를 클릭하거나 뒤로/앞으로 이동하여).

+0

팁 주셔서 감사합니다.우리는 마침내 "UIWebView에 내장 된 goBack 및 goForward 기능을 완전히 무시하고" "뒤로 버튼"으로 직접 URL을 제어한다고 말하면서 마침내 무언가를했습니다. 조건이 충족 될 때 [_webView loadRequest : request]를 사용하여 특정 페이지를로드했습니다. 그리고 지금까지 우리는 우리가 원하는 것을 얻었습니다. 다시 한 번 감사드립니다 크리스, 당신의 대답은 우리를 올바른 방향으로 이끌었습니다! –

관련 문제