読者です 読者をやめる 読者になる 読者になる

プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

UITableVIewの利用

iOS

Interface Builderを利用せずにUITableViewを利用する方法です。ソースコードこちらから。Window-Based Applicationのテンプレートを利用し、UIViewController (MyViewController) を追加して作成しています。


MyViewController.h

UIViewControllerを継承した独自のViewControllerを生成します。
UITableView関連のプロトコル(Interfaceみたいなもの)を指定しています。

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>{
  UITableView *myTableView;	
}
MyViewController.m

UITableViewを生成する際にdelegateとdataSourceを設定します。
dataSourceを指定しないとテーブルにデータが表示されません。

- (void)viewDidLoad {
  [super viewDidLoad];	
  myTableView = [[UITableView alloc] initWithFrame:[self.view bounds]];
  myTableView.delegate = self;
  myTableView.dataSource = self;	
  [self.view addSubview:myTableView];
}


プロトコルにあるメソッドを実装し、テーブルに表示するデータを指定します。
この辺はInterface Builderを利用する場合と同じです。

//テーブルに含まれるセクションの数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return 1;
}
//セクションに含まれる行の数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  return 50;
}
//行に表示するデータの生成
- (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];
  }
	
  cell.text = [NSString stringWithFormat:@"%@ %i", @"row", indexPath.row];
  return cell;
}	 


UITableViewControllerを使わないでテーブルビューを使うとき実装すべきメソッドで言及されているメソッドを実装しておきます。

//Viewが表示される直前に実行される
- (void)viewWillAppear:(BOOL)animated {
  NSIndexPath* selection = [myTableView indexPathForSelectedRow];
  if(selection){
    [myTableView deselectRowAtIndexPath:selection animated:YES];
  }
  [myTableView reloadData];
}
//Viewが表示された直後に実行される
- (void)viewDidAppear:(BOOL)animated {
  [self.myTableView flashScrollIndicators];
}


Instrumentsで確認したところ、シミュレータでleakが発生するが実機で発生しないという現状を確認したのですが、これはシミュレータのバグっぽいので気にしなくてもよさそうな感じです。

参考:シミュレータでUITableView上でメモリリーク?:NSIndexPath