前个星期,完成了老师布置的一个小项目,是通过解析xml文件来读取新浪新闻。
程序主要用到UINavigationController、UITabbarController、UITableViewController以及UIWebViewController。其中填在UINavigationController的目的呢,主要是可以让他为我产生一个标题栏,在以后需要对程序进行扩展的时候,也比较方便,之后主要的界面就是Tabbar里面嵌入TableView。因为我要读取四类新闻,所以就用一个UITabbarController,其中呢,每一个item都指向一个UITableViewController。之后四个UITableViewController的Cell都指向同一个UIWebView.
这就是我这个程序界面的构成了。storyboard的图片下一次补上,宿舍没有iMac
下面讲讲程序的一些主要的代码:
因为这个程序的主体是UITableViewController,所以重点是讲它,我挑显示体育新闻的这个TableView来说,首先当然需要创建一个类来关联这个UITableViewController,自己创建的这个类,要继承于UITableViewController,接下来,很重要的一点是要在storyboard中,选中UItableViewController的Cell,然后给它的Identifier一个自己定义的标识。UITableView中有2个重要的DataSource的函数,
#pragma mark - sportNewsTableViewControllerDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return ([self.newsPubdate count]-2);
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"sportsNewsCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
NSString *title = [self.newsTitle objectAtIndex:indexPath.row+2];
NSString *pubdate = [self.newsPubdate objectAtIndex:indexPath.row+1];
cell.textLabel.text = title;
cell.detailTextLabel.text = pubdate;
return cell;
}
第一个是返回用多少行,第二个是设置每一行。
还有一个函数是返回有多少section,因为默认的是1,而我的程序也只需要是1就可以了,所以那个函数我就直接删掉了,没实现。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中,重要的参数就是indexPath,该参数有1个重要的property ,row 就是当前操作的是那一行,通过这个参数,我们才可以设置相应每一行的数据。
UITableView的delegate还有一个重要的函数
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath,
就是当某一行被选中时,需要做一些什么响应,因为我这次的程序是用segue,所以这个函数我不需要。
下面就说说segue,我是通过当某一行被选中的时,就转到一个UIWebView,去显示新闻的详细内容。因为我需要传一些参数过去给UIWebView,所以需要在我的UITableViewController中实现下面这个函数
#pragma mark - segue
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//do someting for the news content
if([segue.identifier isEqualToString:@"sportNews"])
{
NSMutableString *str = [[NSMutableString alloc] init];
[str appendString:[self.newsLink objectAtIndex:self.tableView.indexPathForSelectedRow.row+2]];
[str deleteCharactersInRange:NSMakeRange(0, 4)];
[segue.destinationViewController setWebURL:str];
[segue.destinationViewController setNewsTitle:@"体育新闻"];
}
}
这个又有一个很重要的细节,就是在创建完一个segue之后,同样要给它命名。
在这个函数里面,我主要是穿了被选中的那一个新闻的链接以及新闻的标题过去给UIWebView,所以在UIWebViewController中,也需要有相应的属性来装。
//
// newsWebViewController.h
// myNewsApplication
//
// Created by mac11 on 12-3-22.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface newsWebViewController : UIViewController
@property (nonatomic,strong) NSString *webURL;
@property (nonatomic,strong) NSString *newsTitle;
@property (nonatomic,weak) IBOutlet UIWebView *webView;
@end
//
// newsWebViewController.m
// myNewsApplication
//
// Created by mac11 on 12-3-22.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import "newsWebViewController.h"
@implementation newsWebViewController
@synthesize webView = _webView;
@synthesize webURL = _webURL;
@synthesize newsTitle = _newsTitle;
-(void)viewDidLoad
{
[super viewDidLoad];
self.webView.scalesPageToFit = YES;
NSString *newWebURL = [NSString stringWithString:self.webURL];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:newWebURL]]];
self.navigationItem.title = self.newsTitle;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (void)viewDidUnload {
[super viewDidUnload];
}
@end
上面就是UIWebViewController的文件的代码,很简单的代码,就是显示一个网页。
需要注意的一个细节是,我是将一个webView直接拖到一个ViewController上的,所以需要创建IBOutlet来关联webView.
好了,说了这么多,程序最重要的地方还没说,就是怎么获取新浪新闻的内容。
这个内容请看下一篇文章NSXMLParser解析xml文件