前个星期,完成了老师布置的一个小项目,是通过解析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
需要注意的一个细节是,我是将一个webView直接拖到一个ViewController上的,所以需要创建IBOutlet来关联webView.
好了,说了这么多,程序最重要的地方还没说,就是怎么获取新浪新闻的内容。
这个内容请看下一篇文章NSXMLParser解析xml文件