&tag(NSTableView); *目次 [#k6d41468] #contents *関連ページ [#p82e7ede] -[[AppKit]] *参考情報 [#m87325d3] -[[Table View Programming Guide for Mac: About Table Views in OS X Applications:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/Introduction/Introduction.html]]…公式ドキュメント -[[NSTableView:http://hmdt.jp/cocoaProg/AppKit/NSTableView/NSTableView.html]] -[[NSTableView にデータを表示させる方法 · rakuishi.com:http://rakuishi.com/archives/5535]] -[[objective c - (Cocoa) What's the equivalent of a UIViewController subclass in a single window cocoa app? - Stack Overflow:http://stackoverflow.com/questions/10123045/cocoa-whats-the-equivalent-of-a-uiviewcontroller-subclass-in-a-single-window]]…UIViewControllerとの違い *基本 [#z76c47e9] -view-baseとcell-baseの違いがある。 -view-baseの方が新しく、iOS的。 [[Cocoa - NSTableViewにカスタムセルを使用する - Qiita:http://qiita.com/_tid_/items/535f3c5ac385cc214d50]]によると実装しないといけないメソッドが異なる。 -objectValueForTableColumnがcell-base、viewForTableColumnがview-base? *超基本的な実装方法 [#md9a92a9] *概要 [#r6d714b4] **概要 [#r6d714b4] -プログラムからゴリゴリつくるのではなく、Interface Builderを使う方法が基本? *Interface Builderを主に使って作成する方法 [#rf9d118a] **Interface Builderを主に使って作成する方法 [#rf9d118a] -1列目にテキストを、2列目に画像を表示するサンプルを考える。 -モデルクラスの配列はAppDelegateのサブクラスなどが保持する。 -そのモデルクラスの配列をArray Controllerにバインディング。 -ビューベースのテーブルビューで、各セルのValueにモデルクラスのプロパティをバインディングする。 **モデルの作成 [#gb90b9e5] ***モデルの作成 [#gb90b9e5] -例えば以下のようなモデルを考える #pre{{ @interface Item : NSObject @property(nonatomic, copy) NSString *title; @property(nonatomic, strong) NSImage *icon; @end }} **AppDelegateのサブクラス(DemoAppDelegate)に保持 [#h5d6f99d] ***AppDelegateのサブクラス(DemoAppDelegate)に保持 [#h5d6f99d] -initでダミーデータを追加しておく #pre{{ - (id)init { self = [super init]; if (self) { self.items = [[NSMutableArray alloc] init]; Item *item1 = [[Item alloc] init]; item1.title = @"abc"; item1.icon = [NSImage imageNamed:@"add.png"]; Item *item2 = [[Item alloc] init]; item2.title = @"def"; item2.icon = [NSImage imageNamed:@"add2.png"]; [_items addObject:item1]; [_items addObject:item2]; } return self; } }} **xibファイルの準備 [#va884a10] ***xibファイルの準備 [#va884a10] -Array Controllerを設置。itemsをバインディングする。 --Attributes InspectorでObject ControllerのModelをClassに。Class NameをItemに。 --Binding InspectorでBind to Demo App Delegateに。Model Key Pathをitemsに。 -Table Viewを設置。 --Attributes InspectorでView Basedに変更。 --Binding InspectorでTable Contentで、Bind to Array Controllerに設定。controller KeyはarrangedObjects。 -1つめの列。Table Column > Table Cell View > Text Fieldにして、Text Fieldにバインドする。 --Binding Inspectorで、Bind to Table Cell Viewに。Model Key PathにobjectValue.titleに。編集したい場合、Allows Editing Multiple Values Selectionにチェック。 -2つめの列。Table Column > Table Cell View > Image Viewにして、Image Viewにバインドする。 --Binding Inspectorで、Bind To Table Cell Viewに。Model Key PathにobjectValue.iconをバインドする。DataではなくValueをバインドすること。 *古い内容 [#g65fe07f] **データソースクラスの生成 [#ge4e9861] -UIKitの場合、UITableViewControllerを使うのが定番だけど、AppKitにはNSTableViewControllerがない(NSViewControllerはあるみたいだけど)。NSObjectを直接継承し、NSTableViewDataSourceを実装するのが定番っぽい。 -例: TableController.h @interface TableController : NSObject <NSTableViewDataSource, NSTableViewDelegate> -TableController.mに必要なメソッドは最低限以下の二つ #pre{{ - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowInde }} - **Interface Builder上で接続 [#j53dd6e3] -Interface Builderで、Table Viewを設置。 -NSObjectを設置して、TableControllerクラスとする。 -Table Viewのデータソースを上のTableControllerに設定(IB上で)。