スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


このエントリーをはてなブックマークに追加

Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方(ランキング編)②

こんにちは、主夫ひろしです。
さてさて、前回の記事の続き。

過去記事は以下。
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方①
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方②
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方③
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方④
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方(ランキング編)①

サンプルコード。
RankingTableViewController.h
-------------------------------------------------------------------


#import <UIKit/UIKit.h>

@interface RankingTableViewController : UITableViewController
- (IBAction)refrechTitle:(id)sender;

// XMLを解析して、必要な情報の配列を返すメソッド
-(NSMutableArray *) loadXML: (NSString *) urlstring;

@end





RankingTableViewController.m
-------------------------------------------------------------------


#import "RankingTableViewController.h"
#import "DetailRankingViewController.h"
#import "SmartCell.h"

@interface RankingTableViewController (){
NSMutableArray* _xmlInfo;
NSString* urlRSS;
NSArray* bookmarkInfo;
}

@end

@implementation RankingTableViewController{
// タグ内の要素を格納する配列
NSMutableArray* titleArray;
NSMutableArray* blog_titleArray;
NSMutableArray* dateArray;
NSMutableArray* linkArray;
// XMLのタグ要素チェック
BOOL itemElementCheck;
BOOL titleElementCheck;
BOOL blog_titleElementCheck;
BOOL dateElementCheck;
BOOL linkElementCheck;

// 要素を出力するテキスト
NSString* titleText;
NSString* blog_titleText;
NSString* dateText;
NSString* linkText;

// web通信に必要となる変数
NSMutableData* receivedData;

// ブックマークに使う配列
NSMutableArray *bookmarkInfo_b;
BOOL tyoufuku;
}

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}


- (void)viewDidLoad
{
[super viewDidLoad];

// テーブルリロード設定。
self.tableView.dataSource = self;

// インターフェース設定。
self.tableView.separatorColor = [UIColor yellowColor];
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0 green:0.89 blue:0.7 alpha:1];
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor grayColor]};
self.tableView.rowHeight = 60;

urlRSS = @“解析するXMLが存在するURL”;

_xmlInfo = [NSMutableArray array];
[_xmlInfo setArray:[self loadXML:urlRSS]];

self.title = @"人気";

// タブバーアイテムをカスタマイズ
UIImage* imageHot = [UIImage imageNamed:@"人気アイコン.png"];
UITabBar* tabBar = self.tabBarController.tabBar;
UITabBarItem* itemHot = [tabBar.items objectAtIndex:0];
[itemHot setFinishedSelectedImage:imageHot withFinishedUnselectedImage:imageHot];


UIImage* imageNew = [UIImage imageNamed:@"新着アイコン.png"];
UITabBarItem* itemNew = [tabBar.items objectAtIndex:1];
[itemNew setFinishedSelectedImage:imageNew withFinishedUnselectedImage:imageNew];


UIImage* imageBookmark = [UIImage imageNamed:@"お気に入りアイコン.png"];
UITabBarItem* itemBookmark = [tabBar.items objectAtIndex:2];
[itemBookmark setFinishedSelectedImage:imageBookmark withFinishedUnselectedImage:imageBookmark];

UIImage* imageSearch = [UIImage imageNamed:@"検索アイコン.png"];
UITabBarItem* itemSearch = [tabBar.items objectAtIndex:3];
[itemSearch setFinishedSelectedImage:imageSearch withFinishedUnselectedImage:imageSearch];

UIImage* imageBlogBetsu = [UIImage imageNamed:@"ブログ別アイコン.png"];
UITabBarItem* itemBlogBetsu = [tabBar.items objectAtIndex:4];
[itemBlogBetsu setFinishedSelectedImage:imageBlogBetsu withFinishedUnselectedImage:imageBlogBetsu];

// カスタムセル設定
[self.tableView registerNib:[UINib nibWithNibName:@"SmartCell" bundle:nil] forCellReuseIdentifier:@"Cell"];
}

- (void)insertNewObject:(id)sender
{
if (!_xmlInfo) {
_xmlInfo = [[NSMutableArray alloc] init];
}
[_xmlInfo insertObject:[NSDate date] atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return _xmlInfo.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSString* cellIdentifier = @"Cell";
SmartCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[SmartCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

NSData* data = _xmlInfo[indexPath.row];
cell.titleLabel.text = [data description];
cell.titleLabel.font = [UIFont boldSystemFontOfSize:15];
cell.titleLabel.textColor = [UIColor brownColor];

cell.dateLabel.text = dateArray[indexPath.row];
cell.dateLabel.font = [UIFont systemFontOfSize:8];
cell.dateLabel.textColor = [UIColor greenColor];

cell.blog_titleLabel.text = blog_titleArray[indexPath.row];
cell.blog_titleLabel.font = [UIFont systemFontOfSize:8];
cell.blog_titleLabel.textColor = [UIColor redColor];


// セルにブックマークボタンをつける。
UIImage* buttonImage = [UIImage imageNamed:@"bookmarkButton.png"];
[cell.button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];
[cell.button setTag:indexPath.row];
[cell.button setTitle:@"" forState:UIControlStateNormal];
[cell.button setBackgroundImage:buttonImage forState:UIControlStateNormal];
[cell.button.titleLabel setFont:[UIFont systemFontOfSize:10]];


return cell;
}

// ブックマークボタンがタップされたときのアクション

-(void)tapButton:(id)sender{
UIButton *button = (UIButton *)sender;
int row = button.tag;
NSLog(@"%d",row);
bookmarkInfo = [NSArray array];
bookmarkInfo = @[titleArray[row],blog_titleArray[row],dateArray[row],linkArray[row]];
NSLog(@"%@",bookmarkInfo[0]);

// ブックマークに格納するための配列を準備
bookmarkInfo_b = [NSMutableArray array];
// NSUserDefaultsのインスタンスを生成。
NSUserDefaults* defaultsB2 = [NSUserDefaults standardUserDefaults];

// ブックマーク登録されたブログデータを取得
NSData* d = [defaultsB2 dataForKey:@"keyBookMark"];
if (d) {
NSMutableArray *Array = [NSKeyedUnarchiver unarchiveObjectWithData:d];
bookmarkInfo_b = [NSMutableArray arrayWithArray:Array];

// タイトルの重複チェック

for (int i = 0; i < bookmarkInfo_b.count; i++)
{
if ([bookmarkInfo_b[i] isEqualToString:titleArray[row]])
{
tyoufuku = YES;
NSLog(@"タイトルが重複しています。");
}
}
if (!tyoufuku)
{
NSLog(@"タイトルの重複ないよ!");
[bookmarkInfo_b addObjectsFromArray:bookmarkInfo];
}
NSLog(@"titleArray2[0]=%@",bookmarkInfo_b[0]);

// アラートで知らせる。

// 生成と同時に各種設定も完了させる例
UIAlertView *alert =
[[UIAlertView alloc]
initWithTitle:nil
message:@"お気に入りに登録しました。"
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil
];
[alert show];
}


// ブックマークに書き込む
NSUserDefaults* defaultsB = [NSUserDefaults standardUserDefaults];



NSData* dataB = [NSKeyedArchiver archivedDataWithRootObject:bookmarkInfo_b];



[defaultsB setObject:dataB forKey:@"keyBookMark"];


BOOL successful = [defaultsB synchronize];
if (successful) {
NSLog(@"データの保存成功!");
}

// ブックマークを読み込んでプログラム内部で確認。この作業をすることで、保存が確定する。
NSUserDefaults* defaultsB3 = [NSUserDefaults standardUserDefaults];

// ブックマーク登録されたブログデータを取得
NSData* d3 = [defaultsB3 dataForKey:@"keyBookMark"];
if (d3) {
NSMutableArray *Array = [NSKeyedUnarchiver unarchiveObjectWithData:d];
bookmarkInfo_b = [NSMutableArray arrayWithArray:Array];
}


// ブックマークに登録したらボタンを消す。
button.alpha = 0;


}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
for (int i = 0; i < titleArray.count; i++) {
if (indexPath.row == i) {
// URL指定
NSURL *url = [NSURL URLWithString:@“XMLを生成するファイルのURL”];
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];
// POST指定
req.HTTPMethod = @"POST";
// BODYに登録、設定
NSString *body = [NSString stringWithFormat:@"a=%@&b=%@", titleArray[i], linkArray[i]];
req.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];

CGRect rc = [[UIScreen mainScreen] applicationFrame];
UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake( 0, 0, rc.size.width, rc.size.height )];
// リクエスト送信
[web loadRequest:req];
// 画面に表示
[self.view addSubview:web];
web.alpha = 0;


NSLog(@"%@", titleArray[i]);
}
}

// カスタムセルを利用した場合セグエ設定はここでする。
[self performSegueWithIdentifier:@"showDetail" sender:self.tableView];
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_xmlInfo removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {

}
}

// セグエ遷移する前の準備
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
// rowの中身を選択されたrowに設定
NSIndexPath* indexPath = [self.tableView indexPathForSelectedRow];

// 選択されたリンク先を変数rowの中身にセット
NSString* link = linkArray[indexPath.row];
[[segue destinationViewController] setDetailItem:link];
}
}


- (IBAction)refrechTitle:(id)sender {
// テーブルを再読み込み
[self.tableView reloadData];
}


// XMLを読込み解析するメソッド
- (NSMutableArray *)loadXML:(NSString *)urlstring{
// 変数の初期化
// 格納する配列
titleArray = [NSMutableArray array];
blog_titleArray = [NSMutableArray array];
dateArray = [NSMutableArray array];
linkArray = [NSMutableArray array];
// 要素チェック
itemElementCheck = NO;
titleElementCheck = NO;
blog_titleElementCheck = NO;
dateElementCheck = NO;
linkElementCheck = NO;
// 要素
titleText = @"";
blog_titleText = @"";
dateText = @"";
linkText = @"";

// URLを作成
NSURL* url = [NSURL URLWithString:urlstring];
// urlからパーサーを作成。
NSXMLParser* parser = [[NSXMLParser alloc]initWithContentsOfURL:url];

// デリゲートをセット
[parser setDelegate:self];

// XMLを解析
[parser parse];



// 配列の一部のタイトル配列を返す
return titleArray;
}

#pragma mark - delegate

// 開始タグの処理
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
// item要素のチェック
if ([elementName isEqualToString:@"item"]) {
itemElementCheck = YES;
}

// title要素のチェック
if (itemElementCheck && [elementName isEqualToString:@"title"]) {
titleElementCheck = YES;
} else {
titleElementCheck = NO;
}

// blog_title要素チェック
if (itemElementCheck && [elementName isEqualToString:@"blog_title"]) {
blog_titleElementCheck = YES;
} else {
blog_titleElementCheck = NO;
}

// date要素のチェック
if (itemElementCheck && [elementName isEqualToString:@"date"]) {
dateElementCheck = YES;
} else {
dateElementCheck = NO;
}

// link要素のチェック
if (itemElementCheck && [elementName isEqualToString:@"link"]) {
linkElementCheck = YES;
} else {
linkElementCheck = NO;
}
}

// 終了タグの処理
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
// item要素のチェック
if ([elementName isEqualToString:@"item"]) {
itemElementCheck = NO;
}

// title要素のチェック
if ([elementName isEqualToString:@"title"]) {
if (titleElementCheck) {
// 配列titleArrayに追加。
[titleArray addObject:titleText];
}
titleElementCheck = NO;
titleText = @"";
}

// blog_title要素のチェック
if ([elementName isEqualToString:@"blog_title"]) {
if (blog_titleElementCheck) {
// 配列blog_titleArrayに追加。
[blog_titleArray addObject:blog_titleText];
}
blog_titleElementCheck = NO;
blog_titleText = @"";
}

// date要素のチェック
if ([elementName isEqualToString:@"date"]) {
if (dateElementCheck) {
// 配列dateArrayに追加。
[dateArray addObject:dateText];
}
dateElementCheck = NO;
dateText = @"";
}

// link要素のチェック
if ([elementName isEqualToString:@"link"]) {
if (linkElementCheck) {
// 配列linkArrayに追加
[linkArray addObject:linkText];
}
// linkElementCheckをNO、linkTextを空にセット
linkElementCheck = NO;
linkText = @"";
}
}

// 要素の取り出し
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
// titleテキストの取り出し
if (titleElementCheck) {
titleText = [titleText stringByAppendingString:string];
}

// blog_titleテキストの取り出し
if (blog_titleElementCheck) {
blog_titleText = [blog_titleText stringByAppendingString:string];
}

// dateテキストの取り出し
if (dateElementCheck) {
dateText = [dateText stringByAppendingString:string];
}

// linkテキストの取り出し
if (linkElementCheck) {
linkText = [linkText stringByAppendingString:string];
}
}


@end



簡単に要点を解説。
【送信】
・XMLを生成するPHPファイルにクリックしたテーブルの情報をPOST送信。
【受信】
・WEB上のXMLファイルにアクセスしてParse。(新着順の場合と同じ処理)

過去記事と一緒に見ていただけるとご理解いただけると思います。
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方①
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方②
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方③
Objective-CでRSS機能を使った『まとめサイトアプリ』の作り方④

ランキングの仕組みをまとめると、
・WEB上のPHP側で Objective-C(iOS)側のPOST送信を受信して変数に代入。それをXML出力している。
・出力されたXMLファイルをObjective-C(iOS)側で受信してParse解析。

次は検索機能について。次の記事へ。。



ブログ人気ランキング参加しています。
↓ポチっと協力していただけると励みになります。


にほんブログ村 ライフスタイルブログへ
スポンサーサイト


このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

博多でオススメのお店
プロフィール

ぽてぴ×ひろし

Author:ぽてぴ×ひろし
訪問ありがとうございます。
しゅふ友2人(主婦&主夫)で始めたブログです。
日々の出来事、つぶやき、お役立ち情報などなど書いていこうと思ってます。

ブログを書いてる人
その①主婦ぽてぴ
 主婦歴:8年
 家族:旦那クンと猫2匹
 得意技:怪しい創作料理
     家事手抜き技の探求
 趣味:アンチエイジング奮闘

その②主夫ひろし
 主婦歴:1か月
 家族:嫁サンと2人暮らし
 得意技:けさ固め、体落とし
 趣味:焼酎を飲みながらプリン
    体と奮闘中

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
楽天
オススメサイト
ブログランキング
↓ポチッ!お願いします♪
iPhoneアプリ
はかたべんももたろう
カテゴリ: 教育, エンターテインメント
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa

Horror Surprised !! 〜どきどきホラー!
カテゴリ: エンターテインメント, ライフスタイル
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa
計画タイマーまねじめん
カテゴリ: ライフスタイル, フード/ドリンク
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa
5文字に思いを込めろ!
カテゴリ: エンターテインメント, ライフスタイル
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa
TOEIC攻略タイマー
カテゴリ: 教育, ビジネス
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa
お買い物べんり電卓〜直感で簡単操作〜
カテゴリ: ライフスタイル, フード/ドリンク
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa


動画:お買い物べんり電卓〜直感で簡単操作〜

脳トレとぅんとぅん
カテゴリ: ゲーム, 教育, 教育, スポーツ
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa


円スケジュール-1日を素早く計画
カテゴリ: ライフスタイル, 仕事効率化
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa


にこにこサッカー
カテゴリ: ゲーム, エンターテインメント, アクション, スポーツ
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa


Todoリスト-優先度で簡単仕分け
カテゴリ: 仕事効率化, ビジネス
価格: 無料 (掲載時)
販売元: Hiroshi Nakagawa


Twitter
食品&飲料
RSSリンクの表示
電子書籍
amazon
ヘルス&ビューティー
リンク
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。