3

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];
        }
    }
}

このアプローチが、同様の問題に直面しているすべての人に役立つことを願っています...

4

1 に答える 1

1

アプリ内のウェブページ間のナビゲーションをより細かく制御したいようですが、標準の戻る/進む機能では機能しません。

goBackの組み込み機能とgoForward機能を完全に無視して問題を単純化しUIWebView、ボタンを「StateManager」タイプのオブジェクトに委任することをお勧めします。アプリケーションの現在の状態とユーザーが行こうとしている方向に基づいて、どの状態になるか(つまり、どのページをロードするか)。

新しい状態をロードするには、[_webView loadRequest:request](または他のロード関数の1つ-以下を参照)を使用します。ここでrequest、は新しい状態を表します。

_requestURL上記のコードでどのように使用されているかはわかりませんが、呼び出す[_webView reload]と、UIWebViewロード関数の1つ(つまり、、、、または)を介してロードされた最後のページloadDataloadHTMLStringまたはloadRequestその後にナビゲートされた最後のページが(リンクをクリックするか、前後に移動します)。

于 2013-02-28T07:29:31.307 に答える