經過漫長的鬥爭,我找到了解決問題的辦法。問題的一個部分是數據模型方面的簡單錯誤,但這並不重要,使用NSTableView委託和數據源要完成更困難的任務。
有主要存在3個難度,阻止很好的理解和管理這個問題:關於差異和表視圖的數據源的- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
典型用法及其委託的- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
任何合理的解釋
下面是步驟幾乎任何地方,你應該做的:
- (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;
}
你可以看到我用第二種方法,但objectValueForTableColumn
可以單獨使用。 你也可以看到,我有NSMutableArray mySelectedShops和mySelectedCountries爲表格視圖中的每一行保存包裝在NSNumber中的NSInteger(1或0)。
如果您設置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類型,這意味着什麼並不如預期的工作。爲了能夠將對象值替換爲數組,我將它轉換爲NSCell來獲得integerValues。它實際上沒有演員工作,所以這對我來說是另一個謎,但我更喜歡它。
很明顯,Apple正在移動以查看基於UITableView的單元格。不過,我希望這對別人有幫助。