2010/01/14

iPhone : 編集可能なテーブルの作成

CoreData Resipeサンプルより。
iPhone : CoreData レシピサンプルを探る

編集可能なテーブルを作るには、
編集可能なテーブルビューセルを作成して使用する。
実装はほとんどなくて、Interface Bulderメインで作成する。セルの操作のためのIBOutletプロパティを設定するだけ。

IB側はこんな感じ



labelとtextfieldになるセルの部分だけを作成する。

手順
1:クラスの作成


新規ファイル>NSObject>種類はUITableViewCellのサブクラス
ViewControllerクラスで作っちゃだめです。
2:xibの作成


新規ファイル>View XIB

3:xibを編集
デフォルトのViewを削除しTableViewCellに変更。

TableViewCellのクラスをEditingTableViewクラスに変更
TableViewCellを配置して、labelとtextFieldを追加する。


TableViewCellのアウトレットにlabelとtextFieldを接続。


File's OwnerのNew Referencing OutletにtextFieldのdelegateを接続する。

後はテーブルビューコントローラーを作って、File's Ownerのクラスに設定する。
さらにFile's Owner経由でテーブルコントローラーのプロパティにEditingTableViewCellを接続する。
テーブルビューコントローラークラス内にXIBを直接読み込んで使用する。
バンドルからXIBを読み込んで、EditiongTableViewCellクラスのViewへ接続する。

編集可能セルとテーブルビューは1セットということになる。複数箇所で使う場合は複数セット用意することになりそう。


EditingTableViewCellクラス
EditingTableViewCellクラスの中身はこんだけ
  1. //インターフェース部  
  2. @interface EditingTableViewCell : UITableViewCell {  
  3.  UILabel *label;  
  4.  UITextField *textField;  
  5. }  
  6.   
  7. @property (nonatomic, retain) IBOutlet UILabel *label;  
  8. @property (nonatomic, retain) IBOutlet UITextField *textField;  
  9.   
  10. @end  
  11.   
  12. //実装部  
  13. #import "EditingTableViewCell.h"  
  14.   
  15. @implementation EditingTableViewCell  
  16.   
  17. @synthesize label, textField;  
  18.   
  19. - (void)dealloc {  
  20.  [label release];  
  21.  [textField release];  
  22.  [super dealloc];  
  23. }  
  24.   
  25. @end  

これを使いたいテーブルビューコントローラーのtableView:cellForRowAtIndexPathメソッドで設定してあげればよい。

Table View Controllerクラス
  1. //インターフェース側  
  2. #import <uikit uikit.h="">  
  3.   
  4. @class EditingTableViewCell;  
  5.   
  6. @interface AnkiEditTableViewController : UITableViewController {  
  7.  @private  
  8.   //なぜプライベートで宣言するのか?  
  9.   EditingTableViewCell *editingTableViewCell;  
  10. }  
  11. @property (nonatomic, assign) IBOutlet EditingTableViewCell *editingTableViewCell;  
  12.   
  13. @end  
  14.   
  15. //実装部  
  16. //全体は省略して必要なところだけ  
  17. //エディットに入れたいので、セレクトさせないようにする。  
  18. - (void)viewDidLoad {  
  19.     [super viewDidLoad];  
  20.  self.tableView.allowsSelection = NO;  
  21.  self.tableView.allowsSelectionDuringEditing = NO;  
  22. }  
  23.   
  24. // セルに設定する  
  25. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  26.  static NSString *cellIdentifire = @"EDITOR_TABLEVIEWCELL";  
  27.  EditingTableViewCell *cell = (EditingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifire];  
  28.   if (cell == nil) {  
  29.    //バンドルからXIBの読み込み  
  30.    [[NSBundle mainBundle] loadNibNamed:@"EditingTableViewCell" owner:self options:nil];  
  31.    //IB上で接続されている。  
  32.    cell = editingTableViewCell;  
  33.    self.editingTableViewCell = nil;  
  34.   }  
  35.    
  36.     return cell;  
  37. }  
  38.   
  39. </uikit>  
EditingTableViewCellはIBOutletとインターフェースを毎回変更すれば、ほとんどそのままで使い回せる。
単純に編集可能なテーブルを生成するだけなら、毎回変更しなくてもこのままでもいい。ビューコントローラークラスの指定を変更するだけでよい。
これくらい公式で用意しておいてくれると助かるのに。