【UITableView】UITableViewにリストを表示する

Posted by: daichi  /  Category: iphone開発

今回はUITableViewにリストを表示します。
基本は前回の【UITableView】UITableViewに文字を表示すると同じで
表示内容をリスト化するといった内容です。

ゴールはこんな画面を表示することです。

配列の要素を表示

前提条件

手順

  • 配列を用意
  • 配列を初期化
  • 配列から表示行数を取得
  • 配列の値を各行に表示

配列を用意

編集するファイル

  • HelloWorldAppDelegate.h
  • HelloWorldAppDelegate.m
まずは表示する配列を用意します。
拡張子.hのファイルはヘッダファイルで、
拡張子.mのファイルは実装ファイルです。

javaでいうとインターフェースクラスとそれを
implementsしたクラスという関係と同じです。

なので、最初に定義ファイルであるHelloWorldAppDelegate.hに
配列をフィールドとして持たせていきます。

HelloWorldAppDelegate.h

@interfaceの定義内に
NSMutableArray *list;
の1行を追加します。

NSMutableArrayが配列のことです。

さらにプロパティとして
@property (nonatomic, copy, readonly) NSArray *list;
の1行を追加します。

@propertyでフィールドを指定することで
getter/setterが用意され、
list = ○○や
●● = listといった表記で使用できるようになります。

修正後のソースは以下のようになります。

?View Code OBJECTIVE-C
@interface HelloWorldAppDelegate : NSObject  {
 
    UIWindow *window;
    UINavigationController *navigationController;
 
	NSMutableArray *list;
}
 
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
 
@property (nonatomic, copy, readonly) NSArray *list;
 
@end


HelloWorldAppDelegate.m

実装クラスであるこのファイルに配列を
使用する定義を書きます。

@implementationから@endの間に以下の1行を追加します。

@synthesize list;

ヘッダファイルの@propertyと@synthesizeは1セットで
書くととらえて問題ないと思います。

内容は以下。

?View Code OBJECTIVE-C
@implementation HelloWorldAppDelegate
 
@synthesize window;
@synthesize navigationController;
 
@synthesize list;


配列を初期化

編集するファイル

  • HelloWorldAppDelegate.m
配列の用意が済んだので、初期化をして
表示するデータを配列にセットします。
ここでは
  • 北斗の拳
  • 戦国無双
  • バイオハザード
の3つを表示するものとして進めます。

初期化は
- (void)applicationDidFinishLaunching:(UIApplication *)application
メソッドで行います。
メソッド開始1行目に以下のコードを追加します。

?View Code OBJECTIVE-C
list = [[NSMutableArray alloc] initWithObjects:@"北斗の拳",@"戦国無双",@"バイオハザード",nil];


処理内容は、
NSMutableArrayのallocメソッドで、インスタンスを生成しています。
そのインスタンスのinitWithObjectメソッドにより、配列の要素をセットします。
initWithObjectはNSArrayクラスのコンストラクタです。

引数に要素を指定します。
が、最後のnilがないと正常に動作してくれません。
nilを忘れずに。

正しくセットされているかを確認するために
NSLog()のデバッグコードを埋め込んでみます。

完成形は以下のようになります。

?View Code OBJECTIVE-C
- (void)applicationDidFinishLaunching:(UIApplication *)application {
	list = [[NSMutableArray alloc] initWithObjects:@"北斗の拳",@"戦国無双",@"バイオハザード",nil];
	NSLog(@"list 1=%@",[list objectAtIndex:0]);
	NSLog(@"list 2=%@",[list objectAtIndex:1]);
	NSLog(@"list 3=%@",[list objectAtIndex:2]);
 
	// Configure and show the window
	[window addSubview:[navigationController view]];
	[window makeKeyAndVisible];
}


listのobjectAtIndexメソッドで要素を取得し、
それをログに出力しています。

この時点でビルドをすると
画面上には何も変化はみられませんが、
デバッガコンソールにリスト要素がセットされている
ログが表示されます。

デバッグ

配列から表示行数を取得

編集するファイル

  • RootViewController.m
前回のnumberOfRowsInSectionの所で
配列の要素数を返してやるように編集します。

内容は以下です。

?View Code OBJECTIVE-C
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    HelloWorldAppDelegate *appDelegate = (HelloWorldAppDelegate *)[[UIApplication sharedApplication] delegate];
	return appDelegate.list.count;
}


配列はHelloWorldAppDelegateで定義されているので、
まずはこいつを取得します。

上のコードのメソッド内1行目です。
これはもうおまじないと思って書いておきます。
もし今後他のDelegateを取得することになっても
クラス名を変更するだけで済むのでこれはコピペで
十分です。きっと。

それからappDelegateのlistのcountを呼びます。
appDelegate.listとして実行できるのは
手順1でgetter/setterを用意したからですね。
NSArrayの要素数はcountで取得できます。

これでTableViewの行数が配列の要素数になります。

ビルドしてみると配列として["北斗の拳","戦国無双","バイオハザード"]
の3つを要素としてセットしたので、3行分表示されていることが
わかります。

配列から要素数を取得して表示

ただし、表示される文字はまだHelloのままです。

配列の値を各行に表示

編集するファイル

  • RootViewController.m
最後に配列の値を表示する部分を実装します。
編集するのは前回でおなじみの
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
メソッドです。
編集箇所は「 // Set up the cell…」の次の行からです。

コードは以下のようになります。

?View Code OBJECTIVE-C
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
    static NSString *CellIdentifier = @"Cell";
 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
 
    // Set up the cell...
	HelloWorldAppDelegate *appDelegate = (HelloWorldAppDelegate *)[[UIApplication sharedApplication] delegate];
	NSArray *tmpList = appDelegate.list;
	NSString *name = [tmpList objectAtIndex:indexPath.row];
	cell.text = name;
    return cell;
}


まずおまじないによってDelegateを取得します。
Delegateのリストを取得し、
リストの要素をobjectAtIndexメソッドで取得しています。

引数のIndexPathはこのcellForRowAtIndexPath呼び出し時に渡される
変数で、表示行数分ループしている時に、
今が何行目かをこのIndexPathが保持しています。

indexPathのrowが何行目かを表しています。

ここまでで実装は終了です。

ビルドしてみると

配列の要素を表示

配列の要素が表示されていますね。

おつかれさまです。
これでTableViewにリストを表示するは終了です。

関連のあるアプリ

ipachi2_icon
iPachi 2009/02/10 リリース
ファイナンス 無料
簡易版パチンコパチスロ収支管理アプリ
app_store_badge

タグ: iPachi, iphone, NSArray, NSString, objecti, objective-c, UITableView, UITableViewCell, アプリ, チュートリアル, デバッグ, パチスロ, リスト, リリース, 収支

関連する投稿

5 Responses to “【UITableView】UITableViewにリストを表示する”

  1. いきちゃん Says:

     企画も面白いし、それだけでなくためになる情報を掲載して頂いてありがとうございます。参考にさせて頂きます。今後SQLiteのデータをTableViwで表示する方法やiPhone Developer Programの登録はまりどころなんかを期待しています。時々覗かせてください。

  2. daichi Says:

    >いきちゃんさん
    こんな辺境の地へ来ていただいてありがとうございます。
    SQLiteやDeveloper登録も今後書く予定なのでまた覗きにきてください。

  3. Dimly Says:

    はじめまして。
    ここの記事を参考にさせていただいている者です。

    ひとつ気になったことを。
    list のプロパティですが、上記の通り、
    @property (nonatomic, copy, readonly) NSArray *list;
    で実装したところ、
    error: type of accessor does not match the type of property "list"
    のようなエラーが出ました。

    そしてここを、
    @property (nonatomic, copy, readonly) NSMutableArray *list;
    のように書き換えたところ、エラーは解消されました。

    当方、SDK3.0での開発ですので、3.0 とそれ以前での違いがあるのですかね?
    始めたばかりで詳しいことはよくわかりませんが…

  4. 匿名 Says:

    >Dimlyさん

    >@property (nonatomic, copy, readonly) NSMutableArray *list;
    >のように書き換えたところ、エラーは解消されました。

    おっしゃる通りですね。書き間違えです。
    ヘッダで宣言してる内部変数はNSMutableArrayなのにプロパティではNSArrayになってしまっていて、型の不一致を起こしてます。
    訂正しておきます。ありがとうございます。

  5. 通りすがりの初心者 Says:

    お世話になります。
    勉強させていただいています。

    わたしがハマったところをフィードバックいたします。

    RootViewController.m

    #import "HelloWorldAppDelegate.h"

    を書かないとコンパイルエラーになるようです。

    それと、
    cell.text
    は、最近
    cell.textLabel.text
    に変わったようです。

    たいした内容ではないですが、念のため。。

コメント

Additional comments powered by BackType

Get Adobe Flash playerPlugin by wpburn.com wordpress themes