2011-02-01 19 views
1

このプログラムには4つの列を持つNSTableViewがあり、そのうち2つはチェックボックスの作成です。私はただ一人で働かせようとしているだけで、私は立ち往生してしまった。
まず、ここに私の関連するコードは次のとおりです。NSTableColumnに状態を反映するためのチェックボックスの取得

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

あなたが見ることができるように、私はむしろバインドよりも、このテーブルのデータソースメソッドを使用しています。私がココアのために読んだ本では、タグ付きのチェックボックスをいくつか作っていましたが、配列になっていると思うので、これは最善のことではないかもしれません。

とにかく、これを実行すると、デバッガにボタンの状態(NSOnStateのために1つのタグ)が表示されます。私の問題は、自分の状態に応じてチェックを入れたりチェックを外したりすることができないということです。私はこの質問を読む:Checkbox on table column won't register click

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

また、私はtableview:setObjectValue:にあるセル定義のものを 'awakeFromNib'に入れるべきかどうか疑問です。私はIBの中にチェックボックスボタンのセルを置いていましたが、それ以前に問題が発生していましたので、プログラムでもそれをやることにしました。これらのすべての中で、私はまだ、setObjectValueメソッドに[myTableVeew reloadData]を持っていました。

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

答えて

4

は、次の2つの問題を持っている:あなたのデータソースが吹き飛ばさ取得し続けると、あなたが適切... objectValueは...メソッドを使用していません。

データソース: あなたの-numberOfRowsInTableViewでのデータソース吹き飛ばすている:メソッドをし、それを表には、リフレッシュを行う必要があるたびに交換します。必要なときに(アプリケーションの起動時など)、テーブルのデータソースメソッドから参照するときにのみ、辞書のキャッシュ(変更可能なコピー)を行いたいと思うでしょう。インスタンス変数に移動し、適切なアクセサを使用する必要があります。

また、データソースメソッドは非常に頻繁に呼び出されるため、高速である必要があるため、パフォーマンスの観点だけでは、これはお勧めできません。大きなデータセットでテーブルを応答させるためには、デリゲートメソッドが想定している質問に答えるために必要な作業のみを行う必要があります。

オブジェクト値:あなただけ通常このメソッド(チェックボックスを切り替えることが意図されている状態を含むのNSNumberオブジェクト

からオブジェクト値を返すべきであるあなたはあなたのテーブルの列の-dataCellを設定する必要がありますビューより簡単に:チェックボックスのセルをInterface Builderのテーブルの列にドラッグして、コードなしでデータセルとして設定します。

追加観察:あなたはは、アプリケーションバンドルが書き込み可能であることに依存していることはありませんしなければならないと「1あなたのようなリソースファイルを上書きしようとしてはならないことに注意して、どのような方法でこの情報への変更を永続化することを計画している場合あなたのバンドルから再読み込みします。バンドルコピーをテンプレートコピーとして使用して、別の場所に情報を保存する必要があります

関連する問題