导航WebView

时间:2009-11-23 20:30:24

标签: iphone uiwebview webview

使用webview可以设置一个简单的“后退”按钮(在导航栏或顶部工具栏中),该按钮不显示WebView的第一个URL上的后退按钮 - 并且仅出现在第二个URL回到第一个?

除非我弄错了,在许多混合原生/网络应用程序(如新闻应用程序)中,您经常会在表格中看到新闻文章(HTML页面而不是“在xcode中编程”表格),超链接到文章详细信息页面(再次,HTML而不是本机编码) - 我无法想象的是,详细信息页面(webview中的第二个URL)如何显示“后退按钮”,但表格(webview中的第一个URL)没有在这些类型的应用中显示按钮吗?

目前,我有一个描述的webview,在屏幕顶部的工具栏中有一个“后退”栏按钮项(出口为WebView的'cangoback'),但是当没有页面时,按钮可以从一开始就可见“回去” -

我所得到的只是:

Webview - 第一个URL,HTML表格 - “后退”按钮显示,但不活动(当然)

Webview - 第二个URL,HTML详细信息页面 - “后退”按钮显示,可以返回。

如何才能将其显示在第二个网址上,或者在第一个网址上隐藏?

此致 好色

编辑(11月25日)

这是我的h:

    #import <UIKit/UIKit.h>
    #import "FilmnoirNavController.h"


    @interface FilmnoirViewController : UIViewController <UIWebViewDelegate> {
        IBOutlet UIWebView *webView;
        IBOutlet UIBarButtonItem *backButton;

    }

    @property (nonatomic, retain) UIWebView *webView;
    @property (nonatomic, retain) UIBarButtonItem *backButton;

- (IBAction)backButtonClicked:(id)sender;

    @end

这是我的m:

#import "FilmnoirViewController.h"


@implementation FilmnoirViewController

@synthesize webView;
@synthesize backButton;

- (IBAction)backButtonClicked:(id)sender {
    [webView goBack];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Initialization code
    }
    return self;
}

/*
 Implement loadView if you want to create a view hierarchy programmatically
 - (void)loadView {
 }
 */

/*
 If you need to do additional setup after loading the view, override viewDidLoad. */
- (void)viewDidLoad {

    NSString *urlAddress = @"http://www.filmsite.org/filmnoir.html";

    //Create a URL object.
    NSURL *url = [NSURL URLWithString:urlAddress];

    //URL Requst Object
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

    //Load the request in the UIWebView.
    [webView loadRequest:requestObj];
}

- (void)webViewDidFinishLoad {
    // Other stuff if necessary...

    // Could use hidden instead of enabled if you don't even want
    // the button to be visible
    backButton.enabled = (webView.canGoBack);
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}

- (void)dealloc {
    [webView release];
    [super dealloc];
}

@end  

我的IB布局:

Filmnoir View Controller (Film noir)
> View
>>Web View
>>Tool Bar
>>>Bar Button Item (Back)

以为我用这样的东西来隐藏backButton:

- (void)webViewDidFinishLoad {
    BOOL ableToGoBack = [webView canGoBack];

    if (ableToGoBack == NO) {
        [backButton setHidden:YES];
    }
    else {
        [backButton setHidden:NO];
    }

但是警告说UIbarButton项可能不响应setHidden - 实际上它没有响应。

2 个答案:

答案 0 :(得分:6)

您应该在(webView.canGoBack == YES)时启用后退按钮。您可以使用webViewDidFinishLoad:等委托方法执行此操作。

- (void)webViewDidFinishLoad {
  // Other stuff if necessary...

  // Could use hidden instead of enabled if you don't even want
  // the button to be visible
  backButtonItem.enabled = (webView.canGoBack);
}

然后,backButtonItem的“Touch Up Inside”操作应该如下所示。

- (IBAction)backButtonClicked:(id)sender {
  [webView goBack];
}

答案 1 :(得分:5)

我知道这有点旧,但我遇到了这个问题。这是因为我没有将代表设置为self。这是我的viewDidLoad:以防其他人遇到此问题。

- (void)viewDidLoad
{
    [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:self.url]];
    [webView setDelegate:self];
    backButton.enabled = NO;
    forwardButton.enabled = NO;
    [super viewDidLoad];
}

viewDidFinishLoad:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // snip ...
    backButton.enabled = (self.webView.canGoBack);
    forwardButton.enabled = (self.webView.canGoForward);
}