0

一番右の列に NSSegmentedCell を持つテーブル ビューがあります。

セルがプルされる NSSegmentedControls は、「any」追跡モード (別名: 複数選択) を使用しており、セグメントは、可能な値: 1、2、および 4 のビットフィールドに基づいて選択されます。値 1 は、A|b を意味します。 |c. 2 は a|B|c です。4はa|b|Cです。3 は A|B|c などです。

そのビットフィールドはデータ ソースの tableView:objectValueForTableColumn:row: メソッドによって返され、セルはデリゲートの tableView:dataCellForTableColumn:row: メソッドで返されます。

tableView:dataCellForTableColumn:row: でセルを個別に設定しても何も起こりません。これは、テーブル ビューがその直後に tableView:objectValueForTableColumn:row: を呼び出してその列の値を取得し、それを使用して列の「値」を設定するためです。セグメント化されたコントロール/セル。

問題はその時点です。

ビットフィールドがセグメントのインデックス値として誤って解釈されているようです: A の場合は 0、B の場合は 1、C の場合は 2 (および選択なしの場合は -1)...単一選択を想定しています。

テーブル ビューが複数のセグメントを適切に設定するように、この設定を行うにはどうすればよいですか? (例: ビットフィールド 3 = A|B|c)

4

1 に答える 1

1

私はこのようにしましたが、うまくいきました:
1)テーブルビューのデータソース/デリゲートメソッドにセグメント化されたコントロールセルへの参照があることを確認してください。私のプロジェクトでは、セグメント化されたコントロールセルをView Controllerクラスのアウトレットプロパティに接続しました

2)セグメント化されたコントロールを持つ列のテーブルのデータソースゲッターメソッドから何かを返します(私のプロジェクトでは、repeatDaysはこの列の識別子です)なし

 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex {
    NSString *colId = [tableColumn identifier];

    if ([colId isEqualToString:@"repeatDays"]) {
        return nil;
    }

    //handle other columns
}

3) tableview のデリゲート willDisplayCell メソッドを実装する

- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSString *colId = [tableColumn identifier];

    if ([colId isEqualToString:@"repeatDays"]) {
        for (int i = 0; i < self.segmentedCell.segmentCount; ++i) {
            BOOL selected = [[self.days objectForKey:[NSNumber numberWithInt:i]] boolValue];
            [self.segmentedCell setSelected:selected forSegment:i];
        }
    }
}

テーブルビューが表示しようとしているときにセグメント化されたセルを構成する必要があります。たとえば、私のプロジェクトでは変更可能な辞書日があり、{0: NO のようなセグメントに対応するブール値が含まれています。 、1: はい、2: いいえ、3: はい、4: いいえ、5: いいえ、6: いいえ}、ここで、0、1、2、3、4、5、6 - セグメント、およびはい/いいえ - これがセグメントが選択されているかどうか

4) 最後に、tableview のデータソース セッター メソッドを実装します。それに渡されるオブジェクトは、クリックされたセグメントのインデックスです。モデルを適切に変更します。つまり、クリックされたセグメント インデックスのフラグを反転します。

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    NSString *colId = [tableColumn identifier];

    if ([colId isEqualToString:@"repeatDays"]) {
        int i = [object intValue];
        BOOL selected = [[self.days objectForKey:[NSNumber numberWithInt:i]] boolValue];
        [self.days setObject:[NSNumber numberWithBool:!selected] forKey:[NSNumber numberWithInt:i]];
    }
}
于 2014-01-19T13:05:33.227 に答える