2011-11-10 42 views
2

我有3個表視圖(10.7.2,Xcode 4.2)的窗口。 它們都是在IB中創建的,NSButtonCells與插座連接。NSButtonCell的NSTableView中的檢查類型不允許改變值

我創建控制器類,我充滿了一些樣本數據的所有三種觀點:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { 
    return 10; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { 

NSButtonCell *buttonCell; 

if(aTableView == dimensionTable) {  
    [dimensionButtonCell setTitle:@"Dimension"]; 
    buttonCell = dimensionButtonCell; 
} 
else if(aTableView == shopTable) { 
    [shopButtonCell setTitle:@"Shop"]; 
    buttonCell = shopButtonCell; 
} 
else if(aTableView == countryTable) { 
    [countryButtonCell setTitle:@"Country"]; 
    buttonCell = countryButtonCell; 
} 


return buttonCell; 

} 

我有2個問題:

  1. 我無法通過GUI改變複選框狀態。不過,我可以用編程方式改變它。它閃爍一下,當你按住鼠標按鈕,但不允許更改...

  2. 我試圖填充數據與視圖,沒有網點到單元格。它沒有工作。 NSButtonCell在單元格視圖內的cels在某種程度上與基於表視圖或「普通」基於表的視圖不同?

回答

4

經過漫長的鬥爭,我找到了解決問題的辦法。問題的一個部分是數據模型方面的簡單錯誤,但這並不重要,使用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; 

} 

你可以看到我用第二種方法,但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的單元格。不過,我希望這對別人有幫助。