2012-11-16 35 views
0

我有一个读取RSS提要的应用程序,当选择表格视图中的某一行时,它将在Web视图中打开该文章。我想要一个按钮来显示一个选项的动作表,以在Safari中打开网址。我正在使用操作表,因为我将在不久的将来为其添加更多按钮。从WebView获取URL以在Safari中打开

WebViewController.m

// 
// WebViewController.m 
// KFBNewsroom 
// 
// Created by KFB on 10/16/12. 
// Copyright (c) 2012 com.kfb. All rights reserved. 
// 

#import "WebViewController.h" 

@implementation WebViewController 

- (void)loadView 
{ 
    // Create an instance of UIWebView as large as the screen 
    CGRect screenFrame = [[UIScreen mainScreen]applicationFrame]; 
    UIWebView *wv = [[UIWebView alloc]initWithFrame:screenFrame]; 
    // Tell web view to scale web content to fit within bounds of webview 
    [wv setScalesPageToFit:YES]; 

    [self setView:wv]; 
} 

- (UIWebView *)webView 
{ 
    return (UIWebView *)[self view]; 
} 


@end 

ListViewController.m

// 
// ListViewController.m 
// KFBNewsroom 
// 
// Created by KFB on 10/16/12. 
// Copyright (c) 2012 com.kfb. All rights reserved. 
// 

#import "ListViewController.h" 
#import "RSSChannel.h" 
#import "RSSItem.h" 
#import "WebViewController.h" 

@implementation ListViewController 
@synthesize webViewController; 

- (void)viewDidLoad 
{ 
    self.title = @"Public Affairs"; 
    UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
    [refresh addTarget:self action:@selector(refreshView:)forControlEvents:UIControlEventValueChanged]; 
    self.refreshControl = refresh; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    NSLog(@"%@ found a %@ element", self, elementName); 
    if ([elementName isEqual:@"channel"]) 
    { 
     // If the parser saw a channel, create new instance, store in our ivar 
     channel = [[RSSChannel alloc]init]; 

     // Give the channel object a pointer back to ourselves for later 
     [channel setParentParserDelegate:self]; 

     // Set the parser's delegate to the channel object 
     [parser setDelegate:channel]; 
    } 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return 0; 
    NSLog(@"channel items %d", [[channel items]count]); 
    return [[channel items]count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // return nil; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 
     cell.textLabel.font=[UIFont systemFontOfSize:16.0]; 
    } 
    RSSItem *item = [[channel items]objectAtIndex:[indexPath row]]; 
    [[cell textLabel]setText:[item title]]; 

    return cell; 
} 

- (void)fetchEntries 
{ 
    // Create a new data container for the stuff that comes back from the service 
    xmlData = [[NSMutableData alloc]init]; 

    // Construct a URL that will ask the service for what you want - 
    NSURL *url = [NSURL URLWithString:@"http://kyfbnewsroom.com/category/public-affairs/feed"]; 

    // Put that URL into an NSURLRequest 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 

    // Create a connection that will exchange this request for data from the URL 
    connection = [[NSURLConnection alloc]initWithRequest:req delegate:self startImmediately:YES]; 
} 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 

    if (self) 
    { 
     [self fetchEntries]; 
    } 

    return self; 
} 

// This method will be called several times as the data arrives 
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data 
{ 
    // Add the incoming chunk of data to the container we are keeping 
    // The data always comes in the correct order 
    [xmlData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)conn 
{ 
    /* We are just checking to make sure we are getting the XML 
    NSString *xmlCheck = [[NSString alloc]initWithData:xmlData encoding:NSUTF8StringEncoding]; 
    NSLog(@"xmlCheck = %@", xmlCheck);*/ 

    // Create the parser object with the data received from the web service 
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:xmlData]; 

    // Give it a delegate 
    [parser setDelegate:self]; 

    //Tell it to start parsing - the document will be parsed and the delegate of NSXMLParser will get all of its delegate messages sent to it before this line finishes execution - it is blocking 
    [parser parse]; 

    // Get rid of the XML data as we no longer need it 
    xmlData = nil; 

    // Reload the table.. for now, the table will be empty 
    [[self tableView]reloadData]; 

    NSLog(@"%@\n %@\n %@\n", channel, [channel title], [channel infoString]); 
} 

- (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error 
{ 
    // Release the connection object, we're done with it 
    connection = nil; 

    // Release the xmlData object, we're done with it 
    xmlData = nil; 

    // Grab the description of the error object passed to us 
    NSString *errorString = [NSString stringWithFormat:@"Fetch failed: %@", [error localizedDescription]]; 

    // Create and show an alert view with this error displayed 
    UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"Error" message:errorString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [av show]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Push the web view controller onto the navigation stack - this implicitly creates the web view controller's view the first time through 
    // [[self navigationController]pushViewController:webViewController animated:YES]; 
    [self.navigationController pushViewController:webViewController animated:YES]; 

    // Grab the selected item 
    RSSItem *entry = [[channel items]objectAtIndex:[indexPath row]]; 

    NSLog(@"Channel Items: %@", [[channel items]objectAtIndex:[indexPath row]]); 

    // Construct a URL with the link string of the item 
    NSURL *url = [NSURL URLWithString:[entry link]]; 

    NSLog(@"Link: %@", [entry link]); 

    // Construct a request object with that URL 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 

    NSLog(@"URL: %@", url); 

    // Load the request into the web view 
    [[webViewController webView]loadRequest:req]; 

    NSLog(@"Request: %@", req); 

    // Set the title of the web view controller's navigation item 
    [[webViewController navigationItem]setTitle:[entry title]]; 

    NSLog(@"Title: %@", [entry title]); 
} 

-(void)refreshView:(UIRefreshControl *)refresh 
{ 
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."]; 

    // custom refresh logic would be placed here... 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMM d, h:mm a"]; 
    NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@",[formatter stringFromDate:[NSDate date]]]; 
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated]; 
    [refresh endRefreshing]; 
} 


@end 

以下就是我正在做的另一种看法,但它是因为它是只使用一个特定的网址是容易得多。

// 
// KYFB.m 
// KFBNewsroom 
// 
// Created by KFB on 11/14/12. 
// Copyright (c) 2012 com.kfb. All rights reserved. 
// 

#import "KYFB.h" 
#import <MessageUI/MessageUI.h> 

@interface KYFB() 

@end 

@implementation KYFB 
@synthesize webView; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     self.title = NSLocalizedString(@"KYFB.com", @"KYFB.com"); 
     self.tabBarItem.image = [UIImage imageNamed:@"kyfb-com"]; 
    } 
    return self; 
} 

- (void) showMenu 
{ 
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:@"Cancel" 
    destructiveButtonTitle:nil otherButtonTitles: @"Open in Safari", nil, nil]; 

    actionSheet.actionSheetStyle = self.navigationController.navigationBar.barStyle; 
    [actionSheet showInView:self.parentViewController.tabBarController.view]; 
} 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    NSString *urlAddress = @"http:www.kyfb.com"; 
    NSURL *url = [NSURL URLWithString:urlAddress]; 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:requestObj]; 

    UIBarButtonItem *systemAction = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showMenu)]; 
    self.navigationItem.rightBarButtonItem = systemAction; 
} 

- (void)actionSheet:(UIActionSheet *)modalView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSURL *url = [NSURL URLWithString:@"http://www.kyfb.com"]; 

    switch (buttonIndex) 
    { 
     case 0: 
     { 
      [[UIApplication sharedApplication] openURL:url]; 
      break; 
     } 
    } 

} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

我只是不知道如何实现这个想法的WebViewController和ListViewController。

更新:我已经添加了代码到我的WebViewController类。系统操作按钮现在显示在Web视图导航栏上,按下后会拉动操作表,但Safari中的打开按钮不会执行任何操作。

WebViewController.h

// 
// WebViewController.h 
// KFBNewsroom 
// 
// Created by KFB on 10/16/12. 
// Copyright (c) 2012 com.kfb. All rights reserved. 
// 

#import <Foundation/Foundation.h> 

// @interface WebViewController : NSObject 
@interface WebViewController : UIViewController <UIActionSheetDelegate> 
{ 
    IBOutlet UIWebView *webView; 
} 

@property (nonatomic, readonly)UIWebView *webView; 

@end 

WebViewController.m

// 
// WebViewController.m 
// KFBNewsroom 
// 
// Created by KFB on 10/16/12. 
// Copyright (c) 2012 com.kfb. All rights reserved. 
// 

#import "WebViewController.h" 

@implementation WebViewController 
@synthesize webView; 

- (void)loadView 
{ 
    // Create an instance of UIWebView as large as the screen 
    CGRect screenFrame = [[UIScreen mainScreen]applicationFrame]; 
    UIWebView *wv = [[UIWebView alloc]initWithFrame:screenFrame]; 
    // Tell web view to scale web content to fit within bounds of webview 
    [wv setScalesPageToFit:YES]; 

    [self setView:wv]; 
} 

- (UIWebView *)webView 
{ 
    return (UIWebView *)[self view]; 
} 

- (void) showMenu 
{ 
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:@"Cancel" 
               destructiveButtonTitle:nil otherButtonTitles: @"Open in Safari", nil, nil]; 

    actionSheet.actionSheetStyle = self.navigationController.navigationBar.barStyle; 
    [actionSheet showInView:self.parentViewController.tabBarController.view]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    UIBarButtonItem *systemAction = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showMenu)]; 
    self.navigationItem.rightBarButtonItem = systemAction; 
} 

- (void)actionSheet:(UIActionSheet *)modalView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    // NSURL *url = [NSURL URLWithString:@"http://www.kyfb.com"]; 
    NSURL *url= webView.request.URL; 

    switch (buttonIndex) 
    { 
     case 0: 
     { 
      [[UIApplication sharedApplication] openURL:url]; 
      break; 
     } 
    } 

} 

@end 

回答

1

clickedButtonAtIndex:您可以使用您的WebView的当前网址:

NSURL *url= webView.request.URL; 
//or NSURL *url = [NSURL URLWithString:webView.request.URL.absoluteString]; 
+0

我以后更新我的帖子做你的建议。 – RagingGoat