Search code examples
iphoneobjective-cxcodeuiwebviewnsdictionary

Pushing to a WebView from an NSDictionary Value


I am working on a app that reads RSS feeds and picks out the specific media. After that the user will be directed to a web view that plays the selected media. I already have the web view built and I can access the URL. I can also open the file in Safari, but I need ti to open within the app. What I have so far is listed below.

I need help pushing the media to the web view. Thank you for your help!

if (indexPath.section == SectionHeader && indexPath.row == SectionHeaderEnclosure) {  
    if (item.enclosures) {  
        for (NSDictionary *dict in item.enclosures){  
            NSString *url = [dict objectForKey:@"url"];  
            NSLog(@" url is : %@",url);  
            //EXPERIMENTAL

            [teachings loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
            self.title = item.title;

            //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
        }  
    }  
}

EDIT: The .m is below

#import "DetailTableViewController.h"
#import "NSString+HTML.h"

typedef enum { SectionHeader, SectionDetail } Sections;
typedef enum { SectionHeaderTitle, SectionHeaderDate, SectionHeaderURL, SectionHeaderEnclosure } HeaderRows;
typedef enum { SectionDetailSummary } DetailRows;

@implementation DetailTableViewController

@synthesize item, dateString, summaryString, teachings;

#pragma mark -
#pragma mark Initialization
- (id)initWithStyle:(UITableViewStyle)style {
if ((self = [super initWithStyle:style])) {

}
return self;
}

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {

// Super
[super viewDidLoad];

// Date
if (item.date) {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterMediumStyle];
    self.dateString = [formatter stringFromDate:item.date];
    [formatter release];
}

// Summary
if (item.summary) {
    self.summaryString = [item.summary stringByConvertingHTMLToPlainText];
} else {
    self.summaryString = @"[No Summary]";
}

}

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 2;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
switch (section) {
    case 0: return 4;
    default: return 1;
}
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

// Get cell
static NSString *CellIdentifier = @"CellA";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

// Display
cell.textLabel.textColor = [UIColor blackColor];
cell.textLabel.font = [UIFont systemFontOfSize:15];
if (item) {

    // Item Info
    NSString *itemTitle = item.title ? [item.title stringByConvertingHTMLToPlainText] : @"[No Title]";

    // Display
    switch (indexPath.section) {
        case SectionHeader: {

            // Header
            switch (indexPath.row) {
                case SectionHeaderTitle:
                    cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
                    cell.textLabel.text = itemTitle;
                    break;
                case SectionHeaderDate:
                    cell.textLabel.text = dateString ? dateString : @"[No Date]";
                    break;
                case SectionHeaderURL:
                    cell.textLabel.text = item.link ? item.link : @"[No Link]";
                    cell.textLabel.textColor = [UIColor blueColor];
                    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
                    break;
                case SectionHeaderEnclosure:
                    cell.textLabel.text = item.link ? item.link : @"[No Link]";
                    cell.textLabel.textColor = [UIColor blueColor];
                    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
                    break;
            }
            break;

        }
        case SectionDetail: {

            // Summary
            cell.textLabel.text = summaryString;
            cell.textLabel.numberOfLines = 0; // Multiline
            break;

        }
    }
}

return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == SectionHeader) {

    // Regular
    return 34;

} else {

    // Get height of summary
    NSString *summary = @"[No Summary]";
    if (summaryString) summary = summaryString;
    CGSize s = [summary sizeWithFont:[UIFont systemFontOfSize:15] 
                   constrainedToSize:CGSizeMake(self.view.bounds.size.width - 40, MAXFLOAT)  // - 40 For cell padding
                       lineBreakMode:UILineBreakModeWordWrap];
    return s.height + 16; // Add padding

}
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// Open URL
if (indexPath.section == SectionHeader && indexPath.row == SectionHeaderURL) {
    if (item.link) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:item.link]];
    }
}

if (indexPath.section == SectionHeader && indexPath.row == SectionHeaderEnclosure) {  
    if (item.enclosures) {  
        for (NSDictionary *dict in item.enclosures){  
            NSString *url = [dict objectForKey:@"url"];  
            NSLog(@" url is : %@",url);  
            //EXPERIMENTAL

            UIWebView *urlView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
            [self.view addSubView:urlView]; 
            [urlView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

            //[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
        }  
    }  
} 

// Deselect
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];

}


#pragma mark -
#pragma mark Memory management

- (void)dealloc {
[dateString release];
[summaryString release];
[item release];
[teachings release];
[super dealloc];
}


@end

Solution

  • Launch it from UIWebView , not in Safari. Here is an example implementation:

    /* WebViewController that is responsible for displaying webview (shown modally) */
    
    @interface WebViewController:UIViewController
    {
        NSString *_url;
        UIWebView *webView;
    }
    @end
    
    @implementation WebViewController
    {
    
     -(void) backClicked
      {
          [self dismissModalViewControllerAnimated:YES];
      }
     -(id) initWithURL:(NSString*)url
    {
        if(self = [super init])
        {
           _url = url;
        }
        return self;
    }
    - (void)loadView 
    {
        self.view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
        webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
        UIButton *backButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
        [backButton addTarget:self action:@selector(backClicked) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubView:webView];
        [self.view addSubView:but];
        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_url]]];
    }
    
    }
    @end   
    

    In your code (import WebViewController to your source file).

    ....
    NSLog(@" url is : %@",url);  
    //EXPERIMENTAL
    
    WebViewController *webVC = [WebViewController alloc] initWithURL:url];
    [self presentModalViewController:webVC animated:YES];
    ....
    

    Note:i implemented only the required methods.
    let me know if this helps.