Table Viewへの行の追加
Table Viewに行を追加するには、RootViewController.mファイル内で2つのメソッドを実装する必要があります。リスト1に示す、米国の州の可変配列を作成するステートメントを追加します。
#import "RootViewController.h" @implementation RootViewController NSMutableArray *listOfStates; - (void)viewDidLoad { //---initialize the array--- listOfStates = [[NSMutableArray alloc] init]; //---add items--- [listOfStates addObject:@"ALABAMA"]; [listOfStates addObject:@"ALASKA"]; [listOfStates addObject:@"ARIZONA"]; [listOfStates addObject:@"ARKANSAS"]; [listOfStates addObject:@"CALIFORNIA"]; [listOfStates addObject:@"COLORADO"]; [listOfStates addObject:@"CONNECTICUT"]; [listOfStates addObject:@"DELAWARE"]; [listOfStates addObject:@"FLORIDA"]; [listOfStates addObject:@"GEORGIA"]; [listOfStates addObject:@"HAWAII"]; [listOfStates addObject:@"IDAHO"]; [listOfStates addObject:@"ILLINOIS"]; [listOfStates addObject:@"INDIANA"]; [listOfStates addObject:@"IOWA"]; [listOfStates addObject:@"KANSAS"]; [listOfStates addObject:@"KENTUCKY"]; [listOfStates addObject:@"LOUISIANA"]; [listOfStates addObject:@"MAINE"]; [listOfStates addObject:@"MARYLAND"]; [listOfStates addObject:@"MASSACHUSETTS"]; [listOfStates addObject:@"MICHIGAN"]; [listOfStates addObject:@"MINNESOTA"]; [listOfStates addObject:@"MISSISSIPPI"]; [listOfStates addObject:@"MISSOURI"]; [listOfStates addObject:@"MONTANA"]; [listOfStates addObject:@"NEBRASKA"]; [listOfStates addObject:@"NEVADA"]; [listOfStates addObject:@"NEW HAMPSHIRE"]; [listOfStates addObject:@"NEW JERSEY"]; [listOfStates addObject:@"NEW MEXICO"]; [listOfStates addObject:@"NEW YORK"]; [listOfStates addObject:@"NORTH CAROLINA"]; [listOfStates addObject:@"NORTH DAKOTA"]; [listOfStates addObject:@"OHIO"]; [listOfStates addObject:@"OKLAHOMA"]; [listOfStates addObject:@"OREGON"]; [listOfStates addObject:@"PENNSYLVANIA"]; [listOfStates addObject:@"RHODE ISLAND"]; [listOfStates addObject:@"SOUTH CAROLINA"]; [listOfStates addObject:@"SOUTH DAKOTA"]; [listOfStates addObject:@"TENNESSEE"]; [listOfStates addObject:@"TEXAS"]; [listOfStates addObject:@"UTAH"]; [listOfStates addObject:@"VERMONT"]; [listOfStates addObject:@"VIRGINIA"]; [listOfStates addObject:@"WASHINGTON"]; [listOfStates addObject:@"WEST VIRGINIA "]; [listOfStates addObject:@"WISCONSIN"]; [listOfStates addObject:@"WYOMING"]; [super viewDidLoad]; } - (void)dealloc { [listOfStates release]; [super dealloc]; } @end
次に、Table Viewに表示する行数を制御するtableView:numberOfRowsInSection:
メソッドを実装します。次のコードでは、行数をlistOfStates
配列の項目数に設定して、Table Viewに追加する行数を指定します。
// Customize the number of rows in the table view. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [listOfStates count]; }
次に、Table View内の特定の位置にセルを挿入するtableView:cellForRowAtIndexPath:
メソッドを実装します。このイベントは、Table Viewの1行につき1回トリガされます。ただし、このメソッドは最初から最後まで一気に連続して呼び出されるわけではありません。例えば、表示できる行が全部で100行あっても、このメソッドは現在表示されている行についてのみ連続してトリガされます。その後、ユーザーがTable Viewをスクロールダウンすると、次に表示される行セットについてtableView:cellForRowAtIndexPath:
メソッドが呼び出されます。次のコードでは、listOfStates
配列から個別の項目を取得して、Table Viewに挿入します。
- (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]; } NSString *cellValue = [listOfStates objectAtIndex:indexPath.row]; cell.textLabel.text = cellValue; return cell; }
具体的には、UITableViewクラスのdequeueReusableCellWithIdentifier:
メソッドを使用してUITableViewCellクラスのインスタンスを取得します。dequeueReusableCellWithIdentifier:
メソッドは再利用可能なTable Viewのセルオブジェクトを返します。セルオブジェクトが再利用可能であるという点は重要です。なぜなら、10,000行にも及ぶ大きなテーブルの場合は、1行につき1つのUITableViewCellオブジェクトを作成するとパフォーマンスやメモリ使用量に大きな影響を与えるからです。また、Table Viewで一度に表示される行数は決まっているため、スクロールによって表示外に出たセルを再利用することは理にかなっています。これが、dequeueReusableCellWithIdentifier:
メソッドで行っている処理の内容です。
例えば、Table Viewに10行が表示される場合、作成されるUITableViewCellオブジェクトは全部で10個だけです。この10個が、ユーザーがTable Viewをスクロールする中で再利用されるわけです。
手始めはこのくらいにしましょう。command+Rキーを押して、iPhone Simulatorでアプリケーションをテストします。図5は、行が追加されたTable ViewをiPhone Simulatorで表示した様子を示しています。