zoukankan      html  css  js  c++  java
  • 点击一个textView里的link导航至程序内可返回的自定义webView

    1,在AppDelegate.h里定义一个 

    id currentViewController;

    在AppDelegate.m里

    @implementation UIApplication (Private)

    - (BOOL)customOpenURL:(NSURL*)url

    {

        beautyAppDelegate *MyWatcher = [[UIApplication sharedApplicationdelegate];

        if (MyWatcher.currentViewController) {

            [MyWatcher.currentViewController handleURL:url];

            return YES;

        }

        return NO;

    }

    @end

    - (void)applicationDidBecomeActive:(UIApplication *)application {  

        Method customOpenUrl = class_getInstanceMethod([UIApplication class],@selector(customOpenURL:));

        Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));

        

        method_exchangeImplementations(openUrl, customOpenUrl);

    }

    在某个viewController里 AppDelegate.currentViewController = self;

    在viewController里定义一个 -(void)handleURL:(NSURL*)url,在这个函数里加载一个自定义的webView;

    当viewController里有某个链接url用户点击时就会回调AppDelegate的- (BOOL)customOpenURL:(NSURL*)url;

    自定义的webView代码如下:

    WebViewController.h里

    #import <UIKit/UIKit.h>

    @interface WebViewController : UIViewController <UIActionSheetDelegateUIWebViewDelegate> {

      UIWebView *webView;

      NSURL *url;

      UIToolbar* toolbar;

      UIBarButtonItem *backButton;

      UIBarButtonItem *forwardButton;

      UIBarButtonItem *actionButton;

    }

    @property (nonatomicretainUIWebView *webView;

    @property (nonatomicretainNSURL *url;

    @property (nonatomicretainUIToolbar* toolbar;

    @property (nonatomicretainUIBarButtonItem *backButton;

    @property (nonatomicretainUIBarButtonItem *forwardButton;

    @property (nonatomicretainUIBarButtonItem *actionButton;

    - (id) initWithURL:(NSURL*)u;

    - (void) doAction;

    - (void)goBack;

    - (void)goForward;

    - (void)reload;

    - (void)stop;

    @end

    WebViewController.m里:

    #import <objc/runtime.h>

    #import "beautyAppDelegate.h"

    #import "WebViewController.h"

    typedef enum {

    BUTTON_RELOAD,

    BUTTON_STOP,

    } ToolbarButton;

    @interface WebViewController (Private)

    - (void)updateToolbar:(ToolbarButton)state;

    @end;

    @implementation WebViewController

    @synthesize webView;

    @synthesize url;

    @synthesize toolbar, backButton, forwardButton, actionButton;

    - (id) initWithURL:(NSURL *)u

    {

      if ( (self = [super init]) )

      {

        backButton    = [[UIBarButtonItem allocinitWithImage:[UIImage imageNamed:@"back.png"]style:UIBarButtonItemStylePlain target:self action:@selector(goBack)];

        forwardButton = [[UIBarButtonItem allocinitWithImage:[UIImage imageNamed:@"forward.png"]style:UIBarButtonItemStylePlain target:self action:@selector(goForward)];

        actionButton  = [[UIBarButtonItemallocinitWithBarButtonSystemItem:UIBarButtonSystemItemAction target:selfaction:@selector(doAction)];

        toolbar           = [UIToolbar new];

        toolbar.barStyle  = UIBarStyleDefault;

        toolbar.tintColor = [UIColor lightGrayColor];

        

        [toolbar sizeToFit];

        CGFloat toolbarHeight = [toolbar frame].size.height;

        CGRect mainViewBounds = self.view.bounds;

        [toolbar setFrame:CGRectMake(CGRectGetMinX(mainViewBounds),

                                     CGRectGetMinY(mainViewBounds) + CGRectGetHeight(mainViewBounds) - (toolbarHeight * 2.0) + 2.0,

                                     CGRectGetWidth(mainViewBounds),

                                     toolbarHeight)];

        webView                 = [[UIWebView allocinitWithFrame:CGRectMake(0, 0, 320, 380)];

        webView.delegate        = self;

        webView.scalesPageToFit = YES;

        url = [u copy];

        

        [self.view addSubview:webView];

        [self.view addSubview:toolbar];

        UIBarButtonItem *flexItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        

        NSArray *items = [NSArray arrayWithObjects: flexItem, backButton, flexItem, flexItem, flexItem,forwardButton

                                                    flexItem, flexItem, flexItem, flexItem, flexItem, flexItem,

                                                    actionButton, flexItem, flexItem, flexItem,actionButton, flexItem, nil];

        [self.toolbar setItems:items animated:NO];

        

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

        

      }

      return self;

    }

    - (void)viewDidAppear:(BOOL)animated

    {

      [super viewDidAppear:animated];

    }

    - (void)viewWillDisappear:(BOOL)animated

    {

      [webView stopLoading];

      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    }

    #pragma mark -

    #pragma mark WebViewActions

    - (void)reload

    {

      [webView reload];

      [self updateToolbar:BUTTON_STOP];

    }

    - (void)stop

    {

      [webView stopLoading];

      [self updateToolbar:BUTTON_RELOAD];

    }

    - (void) goBack

    {

      [webView goBack];

    }

    - (void) goForward

    {

      [webView goForward];

    }

    - (void) doAction

    {

      UIActionSheet *actionSheet = [[UIActionSheet allocinitWithTitle:[self.url absoluteString]

                                                               delegate:self

                                                      cancelButtonTitle:@"Cancel"

                                                 destructiveButtonTitle:nil

                                                      otherButtonTitles:@"Open with Safari"nil];

      [actionSheet showInView:self.navigationController.view];

      [actionSheet release];

    }

    - (void)actionSheet:(UIActionSheet *)as clickedButtonAtIndex:(NSInteger)buttonIndex

    {

      if (as.cancelButtonIndex == buttonIndex) return;

      if (buttonIndex == 0) {    

        // swizzle methods, from here we want to open Safari

        

        Method customOpenUrl = class_getInstanceMethod([UIApplication class],@selector(customOpenURL:));

        Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));

        method_exchangeImplementations(customOpenUrl, openUrl);

        

        [[UIApplication sharedApplicationopenURL:self.url];

      }

    }

    #pragma mark -

    #pragma mark UIWebView

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

    {

      return true;

    }

    - (void)webViewDidStartLoad:(UIWebView *)aWebView

    {

      [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

      [self updateToolbar:BUTTON_STOP];

    }

    - (void)webViewDidFinishLoad:(UIWebView *)aWebView

    {

      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

      self.title = [aWebView stringByEvaluatingJavaScriptFromString:@"document.title"];

      [self updateToolbar:BUTTON_RELOAD];

      self.url = aWebView.request.mainDocumentURL;

    }

    - (void)webView:(UIWebView *)aWebView didFailLoadWithError:(NSError *)error

    {

      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    }

    -(void)updateToolbar:(ToolbarButton)button

    {

      NSMutableArray *items = [toolbar.items mutableCopy];

      UIBarButtonItem *newItem;

      if (button == BUTTON_STOP) {

        UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

        [activityView startAnimating];

        newItem = [[UIBarButtonItem allocinitWithCustomView:activityView];

        [activityView release];

      }

      else {

        newItem = [[[UIBarButtonItem allocinitWithBarButtonSystemItem:UIBarButtonSystemItemRefreshtarget:self action:@selector(reload)] autorelease];

      }

      [items replaceObjectAtIndex:12 withObject:newItem];

      [toolbar setItems:items animated:false];

      [items release];

      // workaround to change toolbar state

      backButton.enabled = true;

      forwardButton.enabled = true;

      backButton.enabled = false;

      forwardButton.enabled = false;

      backButton.enabled = (webView.canGoBack) ? true : false;

      forwardButton.enabled = (webView.canGoForward) ? true : false;

    }

    #pragma mark -

    - (void)dealloc

    {

      [webView release];

      [url release];

      [toolbar release];

      [backButton release];

      [forwardButton release];

      [actionButton release];

      [super dealloc];

    }

    @end

     本文转载至 http://blog.csdn.net/zhuangyou123/article/details/6936850

  • 相关阅读:
    Shell编程之运算符和环境变量配置文件
    Shell编程之变量
    PCI BAR设置过程[转]
    基于ARM的SoC设计入门[转]
    负载均衡
    [转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
    VC/DDK/DriverWorks开发环境配置
    windows下注册表脚本编写
    _cdecl与_stdcall区别
    在C语言中破坏函数调用堆栈
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3159738.html
Copyright © 2011-2022 走看看