UIWebViewのgoBack関数で問題が発生しています。
私の要件は、ユーザーがボタン(「戻るボタン」と呼ばれる)を押したときに、特定の条件でユーザーを特定のページにリダイレクトする必要があることです。これを「カートシステム」と考えてください。ユーザーが「メニュー」ページにいるときに、アイテムを選択して「カートにアイテムを追加」します。「アイテムを削除」をクリックしたら、「アイテムが削除されました」ページに移動します。ユーザーが「戻るボタン」をクリックすると、ユーザーは空のカートページではなく「メニュー」に戻る必要があります。
これを解決するために、「キュー」を使用してURL履歴を保存することを考えました。次に、ユーザーが特定の条件で「戻るボタン」を押し、「キュー」からURLをリロードします。
この回答のおかげで、エンキュー/デキュー機能を使用してカスタムNSMutableArrayを作成しました。次に、それを使用してURL履歴を保存します。
- (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);
}
}
次に、特定の条件で「戻るボタン」が押されたときに「リロード」を呼び出します。
- (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----");
}
}
...
これで、「メニュー」ページのURLとして「delBackPage」を正常に取得できます。しかし、そのURLでwebViewをリロードすると、機能しません。
私は何かが足りないのですか?これを達成する方法はありますか?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];
}
}
}
このアプローチが、同様の問題に直面しているすべての人に役立つことを願っています...