首先需要准备好第三方库ASIHttpRequest、GData+xpath和Reachability
接下来我们在使用这些第三方库之前,需要对他们进行配置
对ASIHttpRequest,我们需要连接一下4个库
具体操作:
点击你的项目名
选择targets的选项卡
选择build phases选项卡
分别添加上述4个库,完成对ASIHttpRequest的配置
接下来,我们需要对GData+xpath进行配置
操作
首先点击你的项目名后选择targets选项卡
选择build settings选项卡
对其中的header search paths设置为/usr/include/libxml2,双击可进行设置,靠后点双击
对other linker flags设置为-lxml2
完成以上设置后,可编译下项目看是否存在错误
以下是项目文件布局
在appdelegate的实现文件中,我们采用了导航控制器的格局
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:viewController];
self.window.rootViewController = nav;
[nav release];
[viewController release];
[self.window makeKeyAndVisible];
return YES;
}
这是ViewController的头文件
#import <UIKit/UIKit.h>
#import "ASIHTTPRequestDelegate.h"
@interface ViewController : UIViewController<ASIHTTPRequestDelegate,UITableViewDelegate,UITableViewDataSource>
{
ASIHTTPRequest *_request;
UITableView *_myTableView;
NSMutableDictionary *_dic;
NSMutableArray *_dataArr;
}
@end
这是ViewController的实现文件中的viewdidload方法
#define SINANEW @"http://rss.sina.com.cn/roll/sports/hot_roll.xml"
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_dic = [[NSMutableDictionary alloc]initWithCapacity:0];
_dataArr = [[NSMutableArray alloc]initWithCapacity:0];
NSURL *url = [NSURL URLWithString:SINANEW];
_request = [[ASIHTTPRequest alloc]initWithURL:url];
_request.delegate = self;
[_request startAsynchronous];
_myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStylePlain];
_myTableView.delegate = self;
_myTableView.dataSource = self;
[self.view addSubview:_myTableView];
}
_dic = [[NSMutableDictionary alloc]initWithCapacity:0];
_dataArr = [[NSMutableArray alloc]initWithCapacity:0];
对数据存储的字典和数组进行初始化
NSURL *url = [NSURL URLWithString:SINANEW];
_request = [[ASIHTTPRequest alloc]initWithURL:url];
_request.delegate = self;
[_request startAsynchronous];
对给定的字符串,将其转换为NSURL对象,并初始化asirequest请求,并设置自身为其代理,调用方法startAsynchronous开始异步下载
_myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStylePlain];
_myTableView.delegate = self;
_myTableView.dataSource = self;
[self.view addSubview:_myTableView];
这个位置对tableview进行初始化并设置其代理和数据源
接下来我们要实现asihttprequestdelegate的协议方法
#pragma mark - ASIHTTPRequestDelegate
-(void)requestFinished:(ASIHTTPRequest *)request
{
NSData *data = [request responseData];
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
if (!document) {
return;
}
NSString *xmlPath = @"/rss/channel/item";
NSArray *nodes = [document nodesForXPath:xmlPath error:nil];
for (GDataXMLElement *element in nodes) {
NSString *title = [[[element elementsForName:@"title"] lastObject]stringValue];
NSString *detail = [[[element elementsForName:@"description"] lastObject]stringValue];
[_dic setValue:detail forKey:title];
[_dataArr addObject:title];
}
[_myTableView reloadData];
}
-(void)requestFailed:(ASIHTTPRequest *)request
{
}
-(void)requestFinished:(ASIHTTPRequest *)request
这个方法是当下载完成时被调用
NSData *data = [request responseData];
通过调用responseData方法,获取下载在数据缓冲区中的数据
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
这里使用上面获取的数据实例化GDataXMLDocument类
NSString *xmlPath = @"/rss/channel/item";
这里我们构造了我们需要数据的xml路径
NSArray *nodes = [document nodesForXPath:xmlPath error:nil];
获取满足该条件的各个节点
for (GDataXMLElement *element in nodes) {
NSString *title = [[[element elementsForName:@"title"] lastObject]stringValue];
NSString *detail = [[[element elementsForName:@"description"] lastObject]stringValue];
[_dic setValue:detail forKey:title];
[_dataArr addObject:title];
}
遍历节点,获取其中所要的数据并将数据存在字典与数组中
[_myTableView reloadData];
这里将数据刷给表格视图来显示
#pragma mark - TableViewDelegate
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [_dataArr count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifies = @"CellIdentifies";
UITableViewCell *oneCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifies];
if (!oneCell) {
oneCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifies];
}
oneCell.textLabel.text = [_dataArr objectAtIndex:indexPath.row];
return oneCell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *key = [_dataArr objectAtIndex:indexPath.row];
NSString *detail = [_dic objectForKey:key];
if (detail.length == 4) {
detail = @"暂无信息";
}
DetialViewController *detailCtl = [[DetialViewController alloc]init];
detailCtl.detail = detail;
[self.navigationController pushViewController:detailCtl animated:YES];
[detailCtl release];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
这个方法决定表格视图显示的行数
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
这个方法决定表格视图中每一个单元格的绘制
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
这个方法当表格视图中的行被点击时被调用
[self.navigationController pushViewController:detailCtl animated:YES];
这里我们使用了navigationcontroller来push出下一个要显示的视图控制器
以下是detailviewcontroller的头文件
#import <UIKit/UIKit.h>
@interface DetialViewController : UIViewController
{
NSString *_detail;
UILabel *_label;
}
@property (nonatomic,copy) NSString *detail;
@end
-(void)setDetail:(NSString *)detail
{
if (_detail!=detail) {
[_detail release];
_detail = [detail retain];
_label.text = _detail;
}
}
对属性detail的set方法重写
使得对detail设置值时能同时将其值显示到label上
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
_label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44)];
_label.numberOfLines = 0;
_label.backgroundColor = [UIColor whiteColor];
_label.text = self.detail;
_label.textColor = [UIColor redColor];
[self.view addSubview:_label];
}
return self;
}
在上述方法中,实例化一个label,用于显示详细内容