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