CoreData に関する記事はいくつか書いてきたんだが、実用的には NSTableView とリンクして使いたい。
なのだが、cocoa & Objective-C 環境で作成されたサンプルがないんだな、これが(笑)。
UITableView になってしまうが iOS & Swift なら結構あるんですけどね。
まあ、ないと iPhone アプリでデータのテーブル表示できないでしょうから、当然でしょうけど。
NSTableView 単独になってしまうけど、かろうじて見つけたのが、これ。
おそるおそる現環境(MacOS Ventura, Xcode 14)でビルド。
おお、修正なしで一発動作。よしよし。
解説記事も充実している(態度豹変)。
このサンプルをベースに CoreData のデータと NSTableView のセルを結びつける。
結果的には、まあまあできた。
ポイントは、NSTableDataSource プロトコルと NSTableViewDelegate プロトコルに必須の二つのメソッドを実装するところでしょうか。
こういうとき「動く」サンプルは便利だと思うのだが、サンプルを少々訂正するだけでいいし、だから、その意味を掴みやすい。
ワイはこんな風に実装した。
// NSTableViewDataSource Protocol Method
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
//return self.numbers.count;
return self.personname.count;
}
// NSTableViewDelegate Protocol Method
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSString *identifier = tableColumn.identifier;
NSTableCellView *cell = [tableView makeViewWithIdentifier:identifier owner:self];
if ([identifier isEqualToString:@"personname"]) {
//cell.textField.stringValue = [self.numbers objectAtIndex:row];
cell.textField.stringValue = [self.personname objectAtIndex:row];
} else {
cell.textField.stringValue = [self.personage objectAtIndex:row];
}
return cell;
}
元コードではセル値の供給元になっている numbers は NSArray として定義されていたが、これだと可変値は扱いにくい。データを追加・削除しやすいように NSMutableArray に変更した。
これはなかなか勉強になった。
最終的には、sqlite のデータが書き変わったら、テーブルのセル値も追従して変えてくれるようにしたいんだが、現状だとちょっと難しいかな。(よくわからない人は「NSTableView update」あたりで検索かけましょう。ただ、これ、オブジェクト間通信を使えばいいような? 設計的に美しくないし、可読性落ちるけどさ→やはり通知でできましたとさ)