2011-11-10 26 views
2

私は3テーブルビュー(10.7.2、Xcode 4.2)のウィンドウを持っています。 これらはすべてIBで作成され、NSButtonCellはアウトレットと接続されます。NSTableView内のチェックタイプのNSButtonCellは値を変更できません

私は、コントローラクラスを作成し、私はいくつかのサンプルデータをすべての3つのビューがいっぱい:

- (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つの質問があります:私はGUIを通じて、チェックボックスの状態を変更することはできません

  1. を。私はそれをプログラム的に変更することができます。マウスボタンを押したままにすると、少し点滅しますが、変更は許可されません。

  2. 私は、アウトレットを表示せずにデータを入力しようとしました。それはうまくいかなかった。セルビュー内のNSButtonCellセルは、ビューベースのテーブルビューまたは「通常の」セルベースのテーブルビューとは何らかの違いがありますか?

答えて

4

私はこの問題の解決方法を見つけることができます。この問題の1つは、データモデル側では単純なバグでしたが、それは重要ではありませんでした.NSTableViewのデリゲートとデータソースを使用するのがはるかに困難でした。

良い理解を防止して、この問題を管理する主に3難しさがありました:

  • Appleのドキュメントには、テーブルビューのデータソースとデリゲートの- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowの違いと- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndexの典型的な使用法についての合理的な説明の不足が。 NSButtonCellsはカスタムNSCellであるため、後者の方法が必要になるかもしれませんが、必要ではないことが判明しましたが、とにかく最後に残しました。

  • 問題はここでは、ネット

にほとんどどこでも文書化されていません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を使用して、NSInteger(1または0)をNSNumberにラップしてTable Viewに格納することもできます。

    NSCellのstateValueまたはintegerValueを設定しても違いはありません。両方ともNSButtonCellをNSInteger型の値1または0でチェックしたり、チェックを外したりします。私はNSCellのオブジェクトにNSInteger値を通過したものの

    - (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]]]; 
    
        } 
    
    } 
    

    は、anObjectはここに期待どおりに動作しないものを意味__NSCFBooleanタイプのものです。オブジェクトの値を配列に置き換えるには、integerValuesを得るためにNSCellにキャストしました。それは実際にキャストなしでも機能するので、それは私にとって別の謎ですが、私はそれをもっと好きです。

    アップルがUITableViewのようなビューベースのセルに移動していることは明らかです。それでも、これが誰かに役立つことを願っています。

  • 関連する問題