首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》21.2 UIWebView

关灯直达底部

之前介绍过,课程的详细信息是一个NSDictionary对象,其中含有“url”键,值是一个URL字符串,表示对应的课程网址。下面要让用户在选中某项在线课程后,可以浏览该课程的网页。读者可能会想到让Nerdfeed启动Safari浏览器,但是如果用户在查看了网页之后需要继续使用Nerdfeed,就必须再从Safari浏览器切换回Nerdfeed。其实还有更好的解决方案——Apple提供了UIWebView,可以不用切换至Safari就能在应用内直接打开网页。

UIWebView对象可以显示指定的网页内容。实际上,iOS设备和模拟器中的Safari浏览器也是通过UIWebView对象来显示网页内容的。本节将创建一个新的视图控制器,它的view是一个UIWebView对象。当用户在UITableView对象中选中某项在线课程时,Nerdfeed要将这个视图控制器压入UINavigationController栈,然后要求UIWebView对象载入相应的课程网页。

创建一个新的NSObject子类并将其命名为BNRWebViewController。在BNRWebViewController.h中声明一个新属性URL,然后将BNRWebViewController的父类改为UIViewController,代码如下:

@interface BNRWebViewController : NSObject

@interface BNRWebViewController : UIViewController

@property (nonatomic) NSURL *URL;

@end

在BNRWebViewController.m中,加入以下代码:

@implementation BNRWebViewController

- (void)loadView

{

UIWebView *webView = [[UIWebView alloc] init];

webView.scalesPageToFit = YES;

self.view = webView;

}

- (void)setURL:(NSURL *)URL

{

_URL = URL;

if (_URL) {

NSURLRequest *req = [NSURLRequest requestWithURL:_URL];

[(UIWebView *)self.view loadRequest:req];

}

}

@end

在BNRCoursesViewController.h中,声明一个新属性,指向BNRWebViewController对象。代码如下:

@class BNRWebViewController;

@interface BNRCoursesViewController : UITableViewController

@property (nonatomic) BNRWebViewController *webViewController;

@end

在BNRAppDelegate.m中,导入BNRWebViewController.h,创建BNRWebView- Controller对象并将其赋给BNRCoursesViewController对象的webViewController属性。代码如下:

#import “BNRWebViewController.h”

@implementation BNRAppDelegate

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window =

[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

BNRCoursesViewController *cvc = [[BNRCoursesViewController alloc]

initWithStyle:UITableViewStylePlain];

UINavigationController *masterNav =

[[UINavigationController alloc] initWithRootViewController:cvc];

BNRWebViewController *wvc = [[BNRWebViewController alloc] init];

cvc.webViewController = wvc;

self.window.rootViewController = masterNav;

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

(注意,之前的项目都是由UINavigationController对象的当前视图控制器负责创建下一个需要入栈的视图控制对象。而本章的Nerdfeed则是由BNRAppDelegate创建BNRWebViewController对象。这样做的目的是为第22章做准备:第22章的Nerdfeed在iPad中将改用UISplitViewController显示视图控制对象。)

在BNRCoursesViewController.m中,导入BNRWebViewController.h,然后实现tableView:didSelectRowAtIndexPath:。当用户点击UITableView对象中的某个UITableViewCell后,Nerdfeed会创建BNRWebViewController对象并将其压入UINavigationController栈。代码如下:

#import “BNRWebViewController.h”

@implementation BNRCoursesViewController

- (void)tableView:(UITableView *)tableView

didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSDictionary *course = self.courses[indexPath.row];

NSURL *URL = [NSURL URLWithString:course[@“url”]];

self.webViewController.title = course[@“title”];

self.webViewController.URL = URL;

[self.navigationController pushViewController:self.webViewController

animated:YES];

}

构建并运行应用。点击UITableView对象中的某项在线课程,Nerdfeed应该会打开新的视图控制器并显示相应课程的网页。