UIWebView canGoBack и canGoForward всегда возвращают NO - PullRequest
3 голосов
/ 11 января 2012

Я пытаюсь загрузить данные непосредственно в UIWebView:

[webView loadData:data MIMEType:@"text/html" textEncodingName:@"utf-8" 
          baseURL:nil];

Данные представляют собой строку html, содержащую некоторые внешние ссылки.Я пытаюсь включить кнопки «Назад» и «Вперед» на основе свойств UIWebView:

self.forwardBtn.enabled = self.webView.canGoForward;
self.backBtn.enabled = self.webView.canGoBack;

Однако даже после того, как я щелкнул по различным ссылкам в веб-представлении после начальной загрузки, webView.canGoForward иwebView.canGoBack всегда возвращают NO.

Есть идеи по этому поводу?

Ответы [ 4 ]

5 голосов
/ 12 января 2012

Хорошо, я думаю, проблема в том, что если я использую loadData или loadHTMLString, а затем проверяю URL-адрес запроса в делегате:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSLog(@"url=%@", [request URL]);
    return YES;
}

Кажется, что URL-адрес пуст.Я думаю, именно поэтому нет истории для goBack при использовании loadData.

1 голос
/ 28 мая 2018

Причина в том, что loadHTMLString не добавляет этот HTML-файл в иерархию переходов, даже если вы добавили baseURL.Поэтому вам нужно использовать loadRequest для обычной навигации по иерархии страниц.

let htmlFile = "file"
guard let localfilePath = Bundle.main.path(forResource: htmlFile, ofType: "html"),
        let url = URL(string: localfilePath) else { return }
view.loadRequest(URLRequest(url: url))
1 голос
/ 17 декабря 2013

Простое быстрое решение, перетащите элементы кнопки панели в xib, установите изображение и снимите флажок Включено в Инспекторе атрибутов.

// WebViewController.h
@interface WebViewController : UIViewController <UIWebViewDelegate, UIAlertViewDelegate>

@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *goBack;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *goForward;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

// WebViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    if ([ReachabilityTest networkConnected] == YES)
    {
        [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.urlString]]];
    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Internet Connection!" message:@"Please, make sure you have internet connection" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    }

}


- (void)webViewDidStartLoad:(UIWebView *)_webView {

    [self.activityIndicator startAnimating];
}


- (void)webViewDidFinishLoad:(UIWebView *)_webView {

    [self.activityIndicator stopAnimating];
    self.goBack.enabled = [self.webView canGoBack];
    self.goForward.enabled = [self.webView canGoForward];
}
0 голосов
/ 11 января 2012

Используйте мой код, я использую этот код для моего пользовательского веб-просмотра.Это не идеальный ответ на ваш вопрос, но это поможет.Извините за форматирование :)

- (IBAction)backwordButton:(id)sender {
    [webViewOutlet goBack];}

- (IBAction)forwordButton:(id)sender {
    [webViewOutlet goForward];
}

- (IBAction)stopButton:(id)sender {
    [webViewOutlet stopLoading];
}

- (IBAction)refreshButton:(id)sender {
    [webViewOutlet reload];
}

- (IBAction)backButton:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)viewWillAppear:(BOOL)animated {

    UIImage *goBackImageChange = [UIImage imageNamed:@"browserBackInactive@2x.png"];
    [goback setBackgroundImage:goBackImageChange forState:UIControlStateNormal];

    UIImage *goForwordImageChange = [UIImage imageNamed:@"browserForwardInactive@2x.png"];
    [goforowrd setBackgroundImage:goForwordImageChange forState:UIControlStateNormal];

    NSURL *urlToLoad = [[NSUserDefaults standardUserDefaults] URLForKey:@"URLToLoad"]; 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:urlToLoad];
    [webViewOutlet loadRequest:requestObj];
}

- (void)webViewDidStartLoad:(UIWebView *)webView {

    activityIndicator.hidden = NO;
    [activityIndicator startAnimating];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {

    BOOL ableToGoBack = [webViewOutlet canGoBack];
    BOOL ableToGoForword = [webViewOutlet canGoForward];

    if (ableToGoBack == YES) {
        UIImage *goBackImageChange = [UIImage imageNamed:@"browserBack@2x.png"];
        [goback setBackgroundImage:goBackImageChange forState:UIControlStateNormal];
    } else {
        UIImage *goBackImageChange = [UIImage imageNamed:@"browserBackInactive@2x.png"];
        [goback setBackgroundImage:goBackImageChange forState:UIControlStateNormal];
    }
    if (ableToGoForword == YES) {
        UIImage *goForwordImageChange = [UIImage imageNamed:@"browserForward@2x.png"];
        [goforowrd setBackgroundImage:goForwordImageChange forState:UIControlStateNormal];
    }  else {
        UIImage *goForwordImageChange = [UIImage imageNamed:@"browserForwardInactive@2x.png"];
        [goforowrd setBackgroundImage:goForwordImageChange forState:UIControlStateNormal];
    }

    [activityIndicator stopAnimating];
    activityIndicator.hidden = YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...