如何在Safari中的UIWebview中打开链接

时间:2011-06-05 01:39:22

标签: iphone ios safari uiwebview

我在滚动视图和翻转视图中显示了一个webview,需要找到一种在Safari中点击时打开链接的方法(不在应用程序中)!

我会赞美任何帮助,因为我已经坚持了几个小时!

ArticleScrollVC.h

//  ArticleScrollVC.h




#import <UIKit/UIKit.h>
#import "PagedScrollview.h"
#import "OMPageControl.h"

#define VIEW_FRONT_TAG 98765
#define VIEW_DESCR_TAG 98764

@interface ArticleScrollVC : UIViewController <PagedScrollDelegate>{

    NSArray *articles;
    NSMutableArray *pages;
    IBOutlet PagedScrollView *scrollView;
    IBOutlet OMPageControl *pageControl;
    IBOutlet UIImageView *pageControlBG;
    IBOutlet UIImageView *imageBG;
    int currentPage;
}

@property (nonatomic,retain) NSArray *articles;
@property int currentPage;

- (void)resize;
- (void)changeViewMode;

+ (BOOL) showDescription;

- (IBAction) pageControlDidChange;

@end

// ArticleScrollVC.m

//  ArticleScrollVC.m


#import "ArticleScrollVC.h"
#import "AsyncImageView.h"
#import "TabListViewController.h"
#import "ArticlePageVC.h"


#define PREFIX_TAG 666666

@implementation ArticleScrollVC

static BOOL showDescription = NO;

@synthesize articles;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    [scrollView setScrollDelegate:self];
    [scrollView setCurrentPage:currentPage];
    pageControl.numberOfPages = 0;
    [pageControl setImageNormal:[UIImage imageNamed:@"pageControlNormal.png"]];
    [pageControl setImageCurrent:[UIImage imageNamed:@"pageControlCurrent.png"]];
}

- (int) numberOfPages{
    pageControl.numberOfPages = [articles count];
    if (pageControl.currentPage==0) {
        [pageControl setCurrentPage:1];
        [pageControl setCurrentPage:0];
    }
    //pages = [[NSMutableArray alloc] initWithCapacity:10];
    return [articles count];
}



- (UIView*) viewForPage:(int)page{
    UIDevice *dev = [UIDevice currentDevice];
    NSString *deviceModel = dev.model;
    ArticlePageVC *pageVC;

    if([deviceModel isEqual:@"iPad"] || [deviceModel isEqual:@"iPad Simulator"]){
        pageVC = [[[ArticlePageVC alloc] initWithNibName:@"ArticlePageIpad" bundle:nil] autorelease];
    }else {
        pageVC = [[[ArticlePageVC alloc] initWithNibName:@"ArticlePageVC" bundle:nil] autorelease];
    }

    pageVC.article = (ListItem *)[articles objectAtIndex:page];
    pageVC.view.frame = scrollView.frame;
    CGRect frame = scrollView.frame;
    [pageVC resize:frame];
    pageVC.view.tag = PREFIX_TAG+page;
    return pageVC.view;
}

- (IBAction) pageControlDidChange{
    [scrollView setCurrentPage:[pageControl currentPage]];
}

- (void) didChoosePage:(int)page{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    UIView *pageVC = [self.view viewWithTag:PREFIX_TAG+page];
    UIViewAnimationTransition transition = !showDescription?UIViewAnimationTransitionFlipFromLeft:UIViewAnimationTransitionFlipFromRight;
    [UIView setAnimationTransition:transition
                           forView:pageVC
                             cache:YES];
    [self changeViewMode];
    [UIView commitAnimations];
}

- (void) changeViewMode{
    showDescription = !showDescription;
    for (int page=0; page<[articles count]; page++) {
        UIView *pageVC = [self.view viewWithTag:PREFIX_TAG+page];
        [[pageVC viewWithTag:VIEW_DESCR_TAG] setHidden:!showDescription];
        [[pageVC viewWithTag:VIEW_FRONT_TAG] setHidden:showDescription];
    }
    [scrollView setScrollEnabled:!showDescription];
    [pageControl setHidden:showDescription];
}
- (void) scrollViewChangedPage:(NSNumber*)page{
    pageControl.currentPage = [page intValue];
}

- (void) resize{
    scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    pageControl.frame = CGRectMake(20, self.view.frame.size.height-36, self.view.frame.size.width-40, 36);
    pageControlBG.frame = pageControl.frame;
    [imageBG setFrame:scrollView.frame];

}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

+ (BOOL) showDescription{
    return showDescription;
}

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


@end

// ArticlePageVC.h

//  ArticlePageVC.h


#import <UIKit/UIKit.h>
#import "TabListViewController.h"
#import "AsyncImageView.h"

#import "TabHTMLViewController.h"

@interface ArticlePageVC : UIViewController {

    IBOutlet AsyncImageView *asyncImage;
    IBOutlet UILabel *label;
    IBOutlet UIImageView *labelBG;

    IBOutlet UIWebView *body;
    IBOutlet UILabel *detailLabel;
    IBOutlet UIImageView *detailLabelBG;

    IBOutlet UIImageView *pageControlBG;

    ListItem *article;
}

@property (nonatomic,retain) ListItem *article;
- (void)resize;


@end

// ArticlePageVC.m

//  ArticlePageVC.m


#import "ArticlePageVC.h"
#import "ArticleScrollVC.h"

@implementation ArticlePageVC

@synthesize article;

// The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization.
    }
    return self;
}
*/

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    [asyncImage changeContentMode:UIViewContentModeScaleAspectFit];
    [asyncImage loadImageFromURL:[NSURL URLWithString:article.thumbnailURL]];
    label.text = article.title;
    detailLabel.text = article.title;
    [body loadHTMLString:[article content] baseURL:nil];
    [pageControlBG setImage:[UIImage imageNamed:@"page_control_bg.png"]];

    body.scalesPageToFit = YES;

}

- (void) resize:(CGRect)frame{

    UIDevice *dev = [UIDevice currentDevice];
    NSString *deviceModel = dev.model;
//  ArticlePageVC *pageVC;

    if([deviceModel isEqual:@"iPad"] || [deviceModel isEqual:@"iPad Simulator"]){
        self.view.frame = frame;
        [body setFrame:CGRectMake(20, 130, frame.size.width-40, frame.size.height-130)];

        [label setFrame:CGRectMake(40, frame.size.height-340, frame.size.width-100, 320)];
        [asyncImage resize:CGRectMake(frame.origin.x+10, 0, asyncImage.frame.size.width-40, frame.size.height-286-2)];
        [labelBG setFrame:CGRectMake(20, frame.size.height-320, frame.size.width-40, 284)];
        [pageControlBG setFrame:CGRectMake(20, frame.size.height-36, frame.size.width-40, 36)];
    }else {
        self.view.frame = frame;
        [body setFrame:CGRectMake(20, 120, frame.size.width-40, frame.size.height-120)];

        [label setFrame:CGRectMake(40, frame.size.height-156, frame.size.width-100, 120)];
        [asyncImage resize:CGRectMake(frame.origin.x+10, frame.origin.y+1, asyncImage.frame.size.width-40, frame.size.height-136-2)];
        [labelBG setFrame:CGRectMake(20, frame.size.height-156, frame.size.width-40, 120)];
        [pageControlBG setFrame:CGRectMake(20, frame.size.height-36, frame.size.width-40, 36)];
    }



    [[self.view viewWithTag:VIEW_DESCR_TAG] setHidden:![ArticleScrollVC showDescription]];
    [[self.view viewWithTag:VIEW_FRONT_TAG] setHidden:[ArticleScrollVC showDescription]];
}



- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


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


@end

2 个答案:

答案 0 :(得分:1)

在视图控制器中采用UIWebViewDelegate协议,然后实现-webView:shouldStartLoadWithRequest:navigationType:这样它就会向应用程序发送带有url的-openURL:消息并返回NO以防止Web视图打开它。

答案 1 :(得分:0)

要处理来自其他应用程序(例如Safari)的开放URL,您需要register a URL scheme并在应用程序委托中实施application:openURL:sourceApplication:annotation:。例如,只要方案(andreas://the.url.doesnt/matter/because/your/app#parses-it)是唯一的,您就可以andreas

点击与您的方案的链接将导致iOS委托您的应用程序如何解释此URL(使用上述消息)。我的第一个链接有例子。

要自定义用户点击应用程序中UIWebView中的链接时会发生什么,请使用UIWebViewDelegate协议并实施webView:shouldStartLoadWithRequest:navigationType:

您可以返回NO来阻止网络视图执行“默认”操作(即加载请求),而是执行...无论您想要什么,例如加载其他内容。