Simple Table(1)~テキストの表示

2010. 10. 30
前回から2週間以上間が空いてしまいましたが、『はじめてのiPhoneプログラミング』の次のお題はテーブルビューです。

以前『iPhone SDKプログラミング大全』の勉強の際に触れたこともありますので、復習を兼ねて進めていきます。
(過去記事は『テーブル(1)』『テーブル(2)』『テーブル(3)』を参照してください)

ここでは最初にSimple Tableという、プレーンスタイルのセクションもインデックスも無い単純な構造のテーブルから始めています。

882

コントローラのソースコード内に記述した配列を表示し、画像の追加とデリゲートによる処理(フォントや行の高さのサイズ変更)を学びます。


●プロジェクトの作成

View-based Applicationテンプレートで、プロジェクト名を『Simple Table』とします。

877


●nibファイルの編集

画面全体にテーブルビューを貼り付けます。

Simple_TableViewController.xibをダブルクリックしてInterface Builderで開き、LibraryウィンドウからViewウィンドウへTable Viewをドラッグ&ドロップします。

878

UITableViewオブジェクトはデータソースとデリゲートを持つ必要があります。

今回はデータソースもデリゲートもビューコントローラ(Simple_TableViewController)で行うので、InspectorウィンドウのConnectionsタブを開き、『Outlets』の『dataSource』と『delegate』をDocumentウィンドウのFile's Ownerに接続します。

879

接続が完了したら保存してXcodeに戻ります。


●ヘッダファイルの編集

Simple_TableViewController.hを開き、デリゲート(UITableViewDelegate)とデータソース(UITableViewDataSource)プロトコルを導入し、データソースとなる配列listDataを定義します。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@interface Simple_TableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    NSArray *listData;
}

@property (nonatomic, retain) NSArray *listData;

@end

880


●ソースファイルの編集

Simple_TableViewController.mを開き、配列listDataとデータソースメソッドの実装を行います。
(太字が追加・変更した部分)

#import "Simple_TableViewController.h"

@implementation Simple_TableViewController

@synthesize listData;

#pragma mark Table View Controller Methods


/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
    // Custom initialization
    }
    return self;
}
*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *array = [[NSArray alloc] initWithObjects:@"Yoshika", @"Mio", @"Minna",
    @"Lynette", @"Perrine", @"Erica", @"Gertrud", @"Francesca", @"Charlotte", @"Eila",
     @"Sanya", nil];
    self.listData = array;
    [array release];
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

}

- (void)dealloc {
    [listData release];
    [super dealloc];
}

#pragma mark -
#pragma mark Table View Data Source Methods

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SimpleTableIdentifier] autorelease];
    }

    NSUInteger row = [indexPath row];
    cell.text = [listData objectAtIndex:row];
    return cell;
}


@end

881

今回はinitWithNibName:bundle:メソッド(nibファイルを読み込んでビューコントローラを初期化)はコメントアウトを解除していません。

これまで特に追記することが無くてもメソッドを有効にしていましたが、何かあったのでしょうか?

一方、shouldAutorotateToInterfaceOrientation:メソッド(アプリケーションで有効なデバイスの向きを指定)はコメントアウトを解除しています。
(特に追記はしていません)

・viewDidLoad

(旧版の)本書中およびApress社のサイト内のサンプルコードにおいても、メソッドの最後にスーパークラスによる初期化([super viewDidLoad];)が入っているのが気になります。

過去の勉強では、まず最初にスーパークラスによる初期化を行い、アプリケーション固有の初期設定を後から追加して行うものと記憶しているので記述順序が逆だと思うのですが、本書中にこの辺の説明が無いのでよく分かりません。

ここではこれまで通りに、スーパークラスによる初期化後に個別の初期化を行うようにしています。

initWithObjects:メソッドで新規にarray配列を作成し、listDataプロパティで配列を代入し、array配列は解放します。

・dealloc

listDataプロパティの解放を追記しています。

・tableView:numberOfRowsInSection:

tableView:numberOfRowsInSection:はUITableViewDataSourceプロトコルのメソッドで、指定したテーブルビューにおけるセクションの行数を返します。

後述するtableView:cellForRowAtIndexPath:と共に必須メソッドとなっています。

ここではviewDidLoadで作成したlistData配列の要素数をcountメソッドで与えています。

・tableView:cellForRowAtIndexPath:

tableView:cellForRowAtIndexPath:は、指定したテーブルビューにおけるセルの内容を返します。

このメソッドの中身は少々複雑になっていて、セルに配列の内容を単純に渡すだけでなく、

・過去に表示したセルが再利用できるか?
・再利用可能でない場合に表示するセルを作成

という判別をしています。

これにより、膨大な量の要素を持つ配列でも起動時間の短縮や、メモリの効率的な使用が可能になります。

この辺りの説明は、本書(はじめてのiPhoneプログラミング)の説明が分かり難いです。

iPhone SDKプログラミング大全』での説明が簡潔で分かり易いのですが、一冊の本としてはちょっと???なので強くお薦めはしかねるのが困った所。
(初学者がこれで勉強しようとするには不向きですが、ある程度勉強した後で一通り読んで、何か困った時に読み返すようなものかもしれません)

iPhoneプログラミングUIKit詳解リファレンス』の説明は『はじめてのiPhoneプログラミング』よりは分かり易いのですが、説明文の6~7割がクラス名とメソッド名なので少し読み難いです。
(初学書ではなく困った時に見るリファレンスなので、助長な説明が無いのが正しいのですが)

この手の技術書こそ数が出ないものですし、一般書店では流通していなく、単語検索の必要性が高くて、ページ数も多くて重くかさばるのですから真っ先に電子化されても良さそうだと思うんですが・・・。
(7割方同じ内容の改訂版や増補版を同じような値段で買い直しさせるなら、旧版所持者には格安でアップデートさせるとかあっても良さそうな気がしますが、どうなんでしょう?)

閑話休題。

まず最初にセルを再利用する際に用いられる識別子SimpleTableIdentifierを作ります。

セル生成時に指定し再利用時に判別するのに用いられるもので、このテーブルビューを扱っている間は保持している必要があるためstaticにしています。

次にdequeueReusableCellWithIdentifier:メソッドで再利用識別子を指定し、再利用可能なセルがあればここで返されます。

再利用可能なセルが無い場合(始めてセルを生成する、あるいは以前生成されたセルが既に破棄されている場合)はnilが返されるのでif文で判別し、initWithFrame:reuseIdentifier:メソッドでセルを新規作成します。

引数frameはテーブルビューが自動的に位置とサイズを最適化するのでCGRectZero(位置0,0、サイズ0,0)を、再利用識別子はSimpleTableIdentifierを指定しています。

そしてインデックスパス(階層構造の配列に簡便にアクセスするためのパス)の行番号を取得し、objectAtIndex:メソッドでlistData配列から取得した行番号の内容をセルのtextに割り当て、返します。

882


Geometric Zeros

ゼロの点、矩形、サイズです。

const CGPoint CGPointZero;
const CGRect CGRectZero;
const CGSize CGSizeZero;

CGPointZero

位置が(0,0)の定数の点です。
ゼロ点はCGPointMake(0,0)と同じです。

CGRectZero

位置が(0,0)で幅と高さが0である定数の矩形です。
ゼロ矩形はCGRectMake(0,0,0,0)と同じです。

CGSizeZero

幅と高さが0である定数のサイズです。
ゼロサイズはCGSizeMake(0,0)と同じです。


text

@property(nonatomic, copy) NSString *text

セルのテキストです。
(iOS 3.0では非推奨です。代わりにtextLabeldetailTextLabelプロパティを使用してください)

デフォルトはnilです。
(テキストはありません)


●改良点

この状態でも動作はしますが、使用しているメソッドの内、initWithFrame:reuseIdentifier:textはiOS 3.0以降非推奨になっていますので、initWithStyle:reuseIdentifier:textLabelに置き換えます。
(太字が修正した部分)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier] autorelease];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    return cell;
}

883


textLabel

@property(nonatomic, readonly, retain) UILabel *textLabel

テーブルセルの主なテキストコンテンツに使われるラベルを返します。
(読み込みのみ)

セルの主なラベルを保持します。

UITableViewCellは、指定したセルスタイルのセルを生成し、適したラベルを追加します。

現在定義されているセルスタイル内の主なラベルに付いては『Cell Styles』を参照してください。



参考文献

CGGeometry Reference

UITableViewCell Class Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

iPhoneプログラミングUIKit詳解リファレンスiPhoneプログラミングUIKit詳解リファレンス
(2010/01/12)
所 友太

商品詳細を見る

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose QuietComfort 20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR