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クラスの中身はこんだけ
//インターフェース部
@interface EditingTableViewCell : UITableViewCell {
 UILabel *label;
 UITextField *textField;
}

@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, retain) IBOutlet UITextField *textField;

@end

//実装部
#import "EditingTableViewCell.h"

@implementation EditingTableViewCell

@synthesize label, textField;

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

@end

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

Table View Controllerクラス
//インターフェース側
#import 

@class EditingTableViewCell;

@interface AnkiEditTableViewController : UITableViewController {
 @private
  //なぜプライベートで宣言するのか?
  EditingTableViewCell *editingTableViewCell;
}
@property (nonatomic, assign) IBOutlet EditingTableViewCell *editingTableViewCell;

@end

//実装部
//全体は省略して必要なところだけ
//エディットに入れたいので、セレクトさせないようにする。
- (void)viewDidLoad {
    [super viewDidLoad];
 self.tableView.allowsSelection = NO;
 self.tableView.allowsSelectionDuringEditing = NO;
}

// セルに設定する
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *cellIdentifire = @"EDITOR_TABLEVIEWCELL";
 EditingTableViewCell *cell = (EditingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifire];
  if (cell == nil) {
   //バンドルからXIBの読み込み
   [[NSBundle mainBundle] loadNibNamed:@"EditingTableViewCell" owner:self options:nil];
   //IB上で接続されている。
   cell = editingTableViewCell;
   self.editingTableViewCell = nil;
  }
 
    return cell;
}

EditingTableViewCellはIBOutletとインターフェースを毎回変更すれば、ほとんどそのままで使い回せる。
単純に編集可能なテーブルを生成するだけなら、毎回変更しなくてもこのままでもいい。ビューコントローラークラスの指定を変更するだけでよい。
これくらい公式で用意しておいてくれると助かるのに。