1

私は、4 つの列を持つ NSTableView を持つこのプログラムを作成しています。そのうちの 2 つはチェックボックスで構成されています。私は今、1つだけを機能させようとしていますが、行き詰まっています。
まず、関連するコードは次のとおりです。

    - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { 

    NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"];
    NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree];
    self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization
                                                    propertyListFromData:myDataThree
                                                    mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                                    format:NULL
                                                    errorDescription:NULL];

    return [[flozzCodeAndName objectForKey:@"name"] count];
} 

- (void)tableView:(NSTableView *)tableView 
   setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex
{

    NSButtonCell *cell;
    cell = [[NSButtonCell alloc] init];
    [cell setButtonType:NSSwitchButton];
    [cell setTitle:@""];
    [cell setTag:rowIndex];
    NSLog(@"%d", [cell tag]);
    [cell setCellAttribute:NSCellEditable to:3];
    [cell setImagePosition:NSImageOnly];
    [cell setState:NSOnState];

    NSLog(@"%d", [cell state]);
    [havzColumn setDataCell:cell];
    [myTableVeew reloadData];
    [cell release]; 

}




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

    NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"];
    NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree];
    self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization
                                                    propertyListFromData:myDataThree
                                                    mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                                    format:NULL
                                                    errorDescription:NULL];

    NSArray *myArray = [flozzCodeAndName objectForKey:[aTableColumn identifier]];

    NSString *myStringValue = [myArray objectAtIndex:rowIndex];

    return myStringValue;
}

ご覧のとおり、このテーブルではバインディングではなくデータ ソース メソッドを使用しています。私が読んだ Cocoa の本では、タグ付きのチェックボックスがいくつか作成されていましたが、それらは配列になっていると思うので、それは最善の方法ではないかもしれません。

とにかく、これを実行すると、デバッガーはボタンの状態 (NSOnState のため、すべて 1) と共にタグ (行に相当) を表示します。私の問題は、ボックスの状態に応じてチェックボックスをオンまたはオフにすることができないことです。私はこの質問を読みました:テーブル列のチェックボックスはクリックを登録しません

そして、NSTableView データソース参照。リンクされた質問の Nozzi 氏によると、ボックスの状態を含む配列が必要であるように思われるので[cell state]、NSNumber に設定して NSMutableArray に入れてみました。私はそれを FUBAR しましたが、それが正しいとは思いません。このテーブルには、4 つの列すべてに対して 454 行あります (配列が 0 から始まるため、タグは 453 になります)。

また、tableview:setObjectValue: にあるセル定義のものを「awakeFromNib」に入れる必要があるかどうかも疑問です。IB にチェックボックス ボタン セルを配置しましたが、以前に問題があったため、プログラムでも行うことにしました。これらすべての間、私は[myTableVeew reloadData]setObjectValue メソッドに を持っていましたが、今でも持っています。

他の情報が必要な場合は、私が入手できます。

4

1 に答える 1

4

2つの問題があります。データソースが吹き飛ばされ続けることと、... objectValue ...メソッドを適切に使用していないことです。

データソース: -numberOfRowsInTableView:メソッドでデータソースを吹き飛ばし、テーブルを更新する必要があるたびにデータソースを置き換えます。(アプリケーションの起動時のように)必要な場合にのみディクショナリ(の可変コピー)をキャッシュし、テーブルデータソースメソッドからのみ参照する必要があります。おそらく、それをインスタンス変数に移動し、適切なアクセサーを使用する必要があります。

また、ドキュメントには、データソースメソッドが非常に頻繁に呼び出されるため、高速である必要があると記載されています。したがって、パフォーマンスの観点からのみ、これはお勧めできません。大規模なデータセットでテーブルの応答性を維持するために、デリゲートメソッドが提起している質問に答えるために必要なことだけを実行する必要があります。

オブジェクト値:このメソッドからのみオブジェクト値を返す必要があります(通常、チェックボックスが切り替わる状態を含むNSNumberオブジェクト。

ビューがロードされるとき、またはアプリケーションの起動時に、テーブル列の-dataCellを設定する必要があります。さらに簡単:チェックボックスセルをInterface Builderのテーブル列にドラッグして、コードなしのデータセルとして設定します。

追加の観察:この情報への変更を何らかの方法で永続化する予定の場合は、アプリケーションバンドルが書き込み可能であることに依存したり、バンドルからロードしているようなリソースファイルを上書きしようとしたりしないように注意してください。バンドルコピーをテンプレートコピーとしてのみ使用して、情報を他の場所に保存する必要があります。

于 2011-02-01T18:37:22.267 に答える