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