Передача URL, через UIWebView нажмите неправильно - PullRequest
0 голосов
/ 29 сентября 2010

Хорошо, сейчас у меня есть TabBarController с пятью вкладками.Каждая из этих вкладок является UINavigationControllers.Каждое из представлений, связанных с вкладками, ссылается на файл XIB, содержащий представление с UIWebView.Я хочу, чтобы при нажатии на ссылку в UIWebView в стек помещалось новое навигационное представление (с кнопкой «Назад»), а содержимое заполнялось ссылкой, по которой щелкали, что на самом деле происходит близко, но без сигары.Он загружает исходную страницу, с которой я ушел, например: я нахожусь на www.example.com, и я щелкаю ссылку, и новое представление загружается (с кнопкой «Назад») и просто перезагружается www.example.com: (

Кроме того, у меня есть проверка в методе viewDidLoad, чтобы определить, какая вкладка выбрана и которая, в свою очередь, сообщает, какой контент должен присутствовать.

Вот мой код:

- (void)viewDidLoad {
// Allows webView clicks to be captured.
webView.delegate = self;
// Places statsheet image centered into the top nav bar.
UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage: image];
self.navigationItem.titleView = imageView;
[imageView release];

// Loads webpage according to the tab selected.
if (self.tabBarController.selectedIndex == 0) {
     [webView loadRequest: [ NSURLRequest requestWithURL: [ NSURL URLWithString: @"http://mobile.example.com" ] ] ];
}
else if (self.tabBarController.selectedIndex == 1) {
    [webView loadRequest: [ NSURLRequest requestWithURL: [ NSURL URLWithString: @"http://mobile.example.com/schedule" ] ] ];    
}
else if (self.tabBarController.selectedIndex == 2) {
    [webView loadRequest: [ NSURLRequest requestWithURL: [ NSURL URLWithString: @"http://mobile.example.com/roster" ] ] ];  
}
else if (self.tabBarController.selectedIndex == 3) {
    [webView loadRequest: [ NSURLRequest requestWithURL: [ NSURL URLWithString: @"http://mobile.example.com/stats" ] ] ];   
}
else if (self.tabBarController.selectedIndex == 4) {
    [webView loadRequest: [ NSURLRequest requestWithURL: [ NSURL URLWithString: @"http://mobile.example.com/about" ] ] ];   
}

// Loads the super class.
[super viewDidLoad];

}

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {

NSURL *url = request.URL;
NSString *urlString = url.absoluteString;
NSRange page = [ urlString rangeOfString: @"/?page=" ];
NSRange post = [ urlString rangeOfString: @"/posts/" ];
NSRange notBlog = [ urlString rangeOfString: @"example" ];
// Allow webapge to load if next or prev button is clicked.
if ( page.location != NSNotFound ) {
    return YES;
}
// Pass post link to new view with a back navigation button. 
else if ( post.location != NSNotFound) {
    NavigationViewController *newView = [[NavigationViewController alloc] initWithNibName:@"NavigationView" bundle:nil];
    // ^^^^^^^^^^^^^^^^^^ Here is where the new view is pushed but doesnt load the correct page
    [self.navigationController pushViewController:newView animated:YES];
    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc]
    initWithTitle:@"Back"
    style:UIBarButtonItemStyleBordered
    target:nil
    action:nil];
    self.navigationItem.backBarButtonItem = backBarButtonItem;
    [backBarButtonItem release];
    [newView release];
    return NO;
}
// Allow all links that are a part of the five main pages to be loaded.
else if ( notBlog.location != NSNotFound) {
    return YES;
}
//Allows everything else to be loaded into a new view with a back navigation button.
else {
    NavigationViewController *newView = [[NavigationViewController alloc] initWithNibName:@"NavigationView" bundle:nil];
// ^^^^^^^^^^^^^^^^^^ Here is where the new view is pushed but doesnt load the correct page
    [self.navigationController pushViewController:newView animated:YES];
    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc]
    initWithTitle:@"Back"
    style:UIBarButtonItemStyleBordered
    target:nil
    action:nil];
    self.navigationItem.backBarButtonItem = backBarButtonItem;
    [backBarButtonItem release];
    [newView release];
    return NO;
}

}

1 Ответ

0 голосов
/ 29 сентября 2010

В веб-представлении: shouldStartLoadWithRequest вы никогда не передадите URL-адрес созданному экземпляру NavigationViewController .Это не может работать ...

Так что каждый раз, когда вызывается viewDidLoad, вы вызываете один из ваших 4 URL-адресов в зависимости от состояния tabBar.

Вот что вы должны сделать:

в NavigationViewController:

  • Добавить атрибут "NSURL * pageURL"
  • Создать хороший метод инициализации:
-(id)initWithURL:(NSURL *)url
{
    if ([super initWithNibName:@"NavigationView" bundle:nil])
    {
       _pageURL = [url retain];
    }
    return self;
}

И в viewDidLoad:

if (_pageURL == nil) {
// Loads webpage according to the tab selected.
if (self.tabBarController.selectedIndex == 0) {
     [webView loadRequest: [ NSURLRequest requestWithURL: [ NSURL URLWithString: @"http://mobile.example.com" ] ] ];
}
else if (self.tabBarController.selectedIndex == 1) {
    _pageURL = [ NSURL URLWithString: @"http://mobile.example.com/schedule" ];    
}
else if (self.tabBarController.selectedIndex == 2) {
    _pageURL = [ NSURL URLWithString: @"http://mobile.example.com/roster" ];  
}
else if (self.tabBarController.selectedIndex == 3) {
    _pageURL = [ NSURL URLWithString: @"http://mobile.example.com/stats" ];   
}
else if (self.tabBarController.selectedIndex == 4) {
    _pageURL = [NSURL URLWithString:@"http://mobile.example.com/about" ];   
}
}

[webView loadRequest:[NSURLRequest requestWithURL:_pageURL]];

// Loads the super class.
[super viewDidLoad];

И затем правильно инициализировать ваш экземпляр в webView: shouldStartLoadWithRequest

NavigationViewController *newView = [[NavigationViewController alloc] initWithURL:request.URL];

Добавить в начало

- (BOOL) webView: (UIWebView *) webView shouldStartLoadWithRequest: (NSURLRequest *) запрос navigationType: (UIWebViewNavigationType) navigationType {

NSURL * url = request.URL;

urlString = url.absoluteString;

if ([urlString isEqualToString: _pageURL.absoluteString]) {return YES;}

...

...