Skip to content

iPhoneのImageStoreライブラリをUITableViewで使う

2011年6月24日

非同期でしかもキャッシュまでしてくれる画像ダウンローダー「ImageStore」。
だけどなぜかよく分からず詰まりまくったので使い方を書いておきます。

・ImageStore
http://d.hatena.ne.jp/Psychs/20081024/1224833636

ヘッダーファイル

#import <UIKit/UIKit.h>
#import "ImageStore.h"
@interface RootViewController : UITableViewController {
    @private
    UIImageView *imageView;
    UIImage *image;
    ImageStore *imageStore_;
}
@end

表示するためのビューをひとつ
そのビューに表示するためのUIImageをひとつ
イメージストアの本体を一つ

実装ファイル

#import "RootViewController.h"

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIBarButtonItem *reloadButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reload)];
    self.navigationItem.rightBarButtonItem = reloadButton;
    [reloadButton release];

    //まずは初期化。
    imageStore_ = [[ImageStore alloc] initWithDelegate:self];

}

- (void) reload{
    NSLog(@"rld");
    [self.tableView reloadData];
}

//cellforrow〜で書いたgetImage後に呼ばれる
- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url
{
    NSLog(@"finished");
    image = [sender getImage:url];
    [self.tableView reloadData];

}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)] autorelease];
        imageView.tag = 1;
        imageView.backgroundColor = [UIColor blackColor];
        [cell.contentView addSubview:imageView];

    }else{
        imageView = (UIImageView *)[cell.contentView viewWithTag:1];
    }

    NSLog(@"CellMake");

    image = [imageStore_ getImage:@"http://www.google.co.jp/images/nav_logo72.png"];
    imageView.image = image;

    return cell;
}

- (void)dealloc
{
    [imageView release];
    [image release];
    [imageStore_ release];
    [super dealloc];
}

@end

ViewDidLoadでimageStore_を初期化。
CellForRowAt〜は、

else{
        imageView = (UIImageView *)[cell.contentView viewWithTag:1];
    }

これがないと挙動がおかしくなる。
上でタグの定義するのも忘れずに。

んで、imageにGetImageを代入してビューに入れる。

画像のDLが完了したら、上にあるImageStoreGetNew〜
が呼ばれるから改めてimageにセットしてテーブルリロード

最初は、ImageStoreをヘッダーで宣言せず、 CellForRowAt〜でimageに代入せずにやってたらテーブルリロードで無限ループになって1時間くらい頭抱えた。

だけど使えるようになればこれは便利!やったー!

広告

From → iPhone開発

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。