UITableView/UITableViewCell


インターフェース

@interface Controller : UIViewController
<UITableViewDelegate,UITableViewDataSource>{
UITableView *table;
}
@property (nonatomic,retain) UITableView *table;
@end

実装

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 250, 960)
style:UITableViewStylePlain];
table.delegate = self;
table.dataSource = self;
[self.view addSubview:table];

デリゲート

- (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];
   }
  return cell;
}

テクニック

テーブルの上に画像を入れたい

テーブルビューのヘッダービューにビューを設定する。

indexPathの生成


デリゲートのテンプレ

#pragma
mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
   // Return the number of sections.
   return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
   // Return the number of rows in the section.
   return 0;
}

- (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];
   }
   
   // Configure the cell...
   
   return cell;
}

/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Return NO if you do not want the specified item to be editable.
   return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (editingStyle == UITableViewCellEditingStyleDelete) {
       // Delete the row from the data source
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
   }   
   else if (editingStyle == UITableViewCellEditingStyleInsert) {
       // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
   }   
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Return NO if you do not want the item to be re-orderable.
   return YES;
}
*/

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Navigation logic may go here. Create and push another view controller.
   /*
    <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
    // ...
    // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
    */
}

UITableViewの選択状態を解除したい。

      [tableView deselectRowAtIndexPath:indexPath animated:YES];

カスタムセルを使いたい。

まずUITableViewCellを作り、以下で読み込む(参照 http://cocoadays.blogspot.com/2011/05/ios-uinib-uitableviewcell.html
UINib* nib = [UINib nibWithNibName:CellIdentifier bundle:nil];
NSArray* array = [nib instantiateWithOwner:nil options:nil];
cell = [array objectAtIndex:0];

Nibファイルは、Ownerには何も指定しない。UITableViewCellのクラスをカスタムセルにして、それとラベルなどをつなぐ。

Nibファイルの読み込みについてはリファレンス参照

セルの複数行表示に対応した高さ調節をしたい

ニュアンス的に以下を実行
   [cell.textLabel setNumberOfLines:0];
   
   cell.width = self.tableView.width;
   
   CGSize size  = [cell.textLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.textLabel.width, CGFLOAT_MAX)];
       
   cell.textLabel.size = size;
   cell.height = cell.textLabel.height;
cell.height等は対応するメソッドに置き換えること。

UIScroolViewの上にUITableViewを載せるとdidSelectが呼ばれずに選択できなくなる

【Objective-C】UITableViewのデリゲート/すてんばーい:iPhone開発めも。
http://blog.livedoor.jp/clarissa22/archives/52715806.html
を参照すると、どうも下にあるUIScroolViewがタッチをキャンセルしてしまうようだ。



最終更新:2012年05月08日 12:08