之前介绍过,课程的详细信息是一个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应该会打开新的视图控制器并显示相应课程的网页。