&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上で)。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS