2

3つのテーブルビュー(10.7.2、Xcode 4.2)のウィンドウがあります。それらはすべてIBで作成され、NSButtonCellsはアウトレットに接続されています。

コントローラクラスを作成し、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つの質問があります:

  1. GUIでチェックボックスの状態を変更できません。ただし、プログラムで変更することはできます。マウスボタンを押したままにすると少し点滅しますが、変更はできません...

  2. セルへの出口なしで、ビューと同じようにデータを入力しようとしました。うまくいきませんでした。セルビュー内のNSButtonCellセルは、ビューベースのテーブルビューまたは「通常の」セルベースのテーブルビューとはどういうわけか異なりますか?

4

1 に答える 1

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;

}

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のようにビューベースのセルに移行していることは明らかです。それでも、これが誰かに役立つことを願っています。

于 2011-11-15T10:29:20.467 に答える