iPhoneアプリ:RSSリーダーを作る

このエントリーを含むはてなブックマークはてなブックマーク - iPhoneアプリ:RSSリーダーを作る

iPhoneネットワークプログラミングの第4回と第5回
iPhoneネットワークプログラミング(複数ファイルDL)
iPhoneネットワークプログラミング(XMLパース)
のまとめとして、今度はRSSリーダを作ってみましょう。

今回作るRSSリーダは、プログラム内にハードコーディングされたRSSフィードから情報を読み取り、iPhone上に記事のタイトルを表示し、各記事のタイトルをタップするとSafariでその記事が読める、という非常に高機能な仕上がり(笑)役に立たない度合いは、前回作成した画像ビュアといい勝負w
iPhoneアプリ:画像ビュアを作る

完成図はこちらです。
今回はプログレスバーすらついておりませんが・・

rssreader1rssreader2

さて、ではXcodeで開発を進めていきます。毎度おなじみの手順ですが、今回はプロジェクトの種類をNavigation-Basedで作成しています。

Xcodeの「新規作成」-> 「ファイル」->「新規プロジェクト」を選択。プロジェクトの種類「Application」でテンプレート「Navigation-based Application」を選択。プロジェクト名は「RssReader」にします。今回はIB側での操作はありません。早速、Xcodeにプログラムを書いていきましょう。といっても、ほとんどが概出のものですので、理解はしやすいと思います。

RootViewController.h

@interface RootViewController : UITableViewController 
<NSXMLParserDelegate>{
	NSXMLParser * xmlParser;
	NSMutableArray *titles, *links;	
	
	NSString *currentElement;
	NSMutableString *currentTitle, *currentLink;
}
@end

今回のプログラムでは記事のタイトルの他に、記事へのURLが必要なのでXMLパース編の内容に加えて、currentLinkという変数を追加しています。また、記事のタイトル、URLをそれぞれtitles, linksという名前のNSMutableArray に格納します。
図示すればこんな感じです。

rssreader3

はい、まともなプログラマならNSDictionaryを使いますね(笑)
今回は、サンプルプログラムということで分かりやすさ優先で。

次にRootViewController.mにxml用のデリゲートメソッドを追加していきます。内容はXMLパース編とほぼ同じですね。didEndElementのなかで、記事タイトルとURLをそれぞれの配列に格納しています。

- (void)viewDidLoad {
	[super viewDidLoad];

	NSURL *xmlURL = [NSURL URLWithString:@"http://iiphoneapp.blog51.fc2.com/?xml"]; 
	xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
	
	// 領域確保
	titles = [[NSMutableArray alloc] init];
	links = [[NSMutableArray alloc] init];
	
	// 各種設定
	[xmlParser setDelegate:self]; 
	[xmlParser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
	attributes:(NSDictionary *)attributeDict{ 
	currentElement = [elementName copy]; 
	
	if ([elementName isEqualToString:@"item"]) { 
		currentTitle = [[NSMutableString alloc] init]; 
		currentLink = [[NSMutableString alloc] init]; 
   	 } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
	if ([currentElement isEqualToString:@"title"]) { 
		[currentTitle appendString:string]; 
	} else if( [currentElement isEqualToString:@"link"]) { 
		[currentLink appendString:string]; 		
	}
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    	if ([elementName isEqualToString:@"item"]) { 
		[titles addObject:currentTitle];
		[links addObject:currentLink];		
		
		[currentTitle release];
		[currentLink release];		
	} 
} 

ここまでで、RSSのパースは完成です。次にTableViewの設定を行ないます。下記の各プログラムをRootViewController.mに追加or編集してください。
まずは tableView:numberOfRowsInSectionメソッドを次のように変更してください。ここでは、テーブルに格納する行数をタイトルの記事の数と指定しています。

- (NSInteger)tableView:(UITableView *)tableView 
	numberOfRowsInSection:(NSInteger)section {
	return [titles count];
}

次に、tableView:(cellForRowAtIndexPathメソッドの最後(return cell; の前)に下記の2行を追加してください。このように記述することで、テーブルカラムに記事のタイトルを設定できます。

int index = [indexPath indexAtPosition: [indexPath length] - 1]; 
cell.textLabel.text = [titles objectAtIndex:index];

さて、最後にセルがタップされた時のアクションを設定します。
1行目でタップされたセルの行数をindexに格納します。
2行目でlinks配列から当該URLをとりだし
3行目で改行文字の削除
4行目でSafariを開いています。

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	int index = [indexPath indexAtPosition: [indexPath length] - 1]; 
	NSString * link = [links objectAtIndex:index];

	[link stringByPaddingToLength:([link length]-3) withString:@"" startingAtIndex:0];
	[[UIApplication sharedApplication] openURL:[NSURL URLWithString:link]];
}

ここまで記述できたら、実行して動作するか確認してみてください。なお、この記事作成にあたっては、ここを参考にさせていただきました。あわせて御覧ください。

Leave a Reply

You must be logged in to post a comment.