長い苦労の末、私はなんとか問題の解決策を見つけることができました。問題の一部はデータモデル側の単純なバグでしたが、それは重要ではありませんでした。NSTableViewデリゲートとデータソースを使用して行うのがはるかに困難でした。
これらは主に、この問題を十分に理解して管理することを妨げる3つの問題でした。
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
アップルのドキュメントには、テーブルビューのデータソースと- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
そのデリゲートの違いと一般的な使用法についての合理的な説明がありません。後者の方法が必要に思えるかもしれませんが、NSButtonCellsはカスタムNSCellsであるため、必要ないことがわかりましたが、とにかく最後に残しました。
NSTableViewメソッドの内部変換
問題はネット上のほとんどどこにも文書化されていません
実行する必要のある手順は次のとおりです。
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
buttonCell = [aTableColumn dataCell];
NSString *columnKey = [aTableColumn identifier];
return buttonCell;
}
このメソッドは、使用するかどうかに関係なく実装する必要があることがわかります。
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
buttonCell = [tableColumn dataCell];
NSString *columnKey = [tableColumn identifier];
if(tableView == dimensionTable) {
// returnObject = @"Dimension";
// [dimensionButtonCell setTitle:@"Dimension"];
// buttonCell = dimensionButtonCell;
}
else if(tableView == shopTable) {
[buttonCell setState:[[mySelectedShops objectAtIndex:row] integerValue]];
[buttonCell setTitle:[myShops objectAtIndex:row]];
}
else if(tableView == countryTable) {
[buttonCell setState:[[mySelectedCountries objectAtIndex:row] integerValue]];
[buttonCell setTitle:[myCountries objectAtIndex:row]];
}
return buttonCell;
}
2番目の方法を使用したことがわかりますが、objectValueForTableColumn
単独で使用することもできます。また、テーブルビューの各行のNSNumberでラップされたNSInteger(1または0)を保持するNSMutableArraymySelectedShopsとmySelectedCountriesがあります。
NSCellの状態またはintegerValueを設定しても、違いはありません。どちらも、NSIntegerタイプの値1または0でNSButtonCellをチェックおよびチェック解除します。
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
NSString *columnKey = [aTableColumn identifier];
if(aTableView == dimensionTable) {
// [dimensionButtonCell setTitle:@"Dimension"];
// buttonCell = dimensionButtonCell;
}
else if(aTableView == shopTable) {
[mySelectedShops replaceObjectAtIndex:rowIndex withObject:[NSNumber numberWithInteger:[(NSCell*)anObject integerValue]]];
}
else if(aTableView == countryTable) {
[mySelectedCountries replaceObjectAtIndex:rowIndex withObject:[NSNumber numberWithInteger:[(NSCell*)anObject integerValue]]];
}
}
NSInteger値をNSCellオブジェクトに渡しましたが、ここでのanObjectは__NSCFBooleanタイプです。これは、何かが期待どおりに機能しないことを意味します。オブジェクト値を配列に置き換えることができるようにするために、integerValuesを取得するためにのみNSCellにキャストしました。実際にはキャストなしでも動作するので、もう一つの謎ですが、その方が好きです。
AppleがUITableViewのようにビューベースのセルに移行していることは明らかです。それでも、これが誰かに役立つことを願っています。