1

この例の ImageAndTextCell.h クラスをプロジェクトに追加しようとしています。無事追加できました。以下のような感じです

これ

行をクリックすると、選択したインデックスが取得され、IBAction で緑色に変更する必要があります。これもうまくいきます。しかし、別の行をクリックすると、前の行の緑が赤に変わります。行をチェックするロジックに問題があると確信しています。失敗した以下のコードを実装しました

 - (NSCell *)tableView:(NSTableView *)tv dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {



NSTextFieldCell  *cell = [tableColumn dataCell];
if(tv== [self tableView]){
    if([[tableColumn identifier] isEqualToString:COLUMN_TITLE]){
        if(![tickTracker count]){
            ImageAndTextCell *imageAndTextCell = (ImageAndTextCell *)cell;
            // Set the image here since the value returned from outlineView:objectValueForTableColumn:... didn't specify the image part...
            NSString *fileName = [[NSBundle mainBundle] pathForResource:@"Cross" ofType:@"png"];
            NSImage *markerImage = [[NSImage alloc] initWithContentsOfFile:fileName];
            [imageAndTextCell setImage:markerImage];

        }else{
             for (int i= 0;i < [tickTracker count];i++){ 
              NSLog(@" 123 number %@",[tickTracker objectAtIndex:i]);
              NSInteger myInteger = [[tickTracker objectAtIndex:i] integerValue];
              [changedRows addObject:[tickTracker objectAtIndex:i]];


            if(row == myInteger){
                NSLog(@" %li value ",row);
                ImageAndTextCell *imageAndTextCell = (ImageAndTextCell *)cell;
                // Set the image here since the value returned from outlineView:objectValueForTableColumn:... didn't specify the image part...
                NSString *fileName = [[NSBundle mainBundle] pathForResource:@"Tick" ofType:@"png"];
                NSImage *markerImage = [[NSImage alloc] initWithContentsOfFile:fileName];
                [imageAndTextCell setImage:markerImage];

            }else{
                 ImageAndTextCell *imageAndTextCell = (ImageAndTextCell *)cell;
                 // Set the image here since the value returned from outlineView:objectValueForTableColumn:... didn't specify the image part...
                NSString *fileName = [[NSBundle mainBundle] pathForResource:@"Cross" ofType:@"png"];
                NSImage *markerImage = [[NSImage alloc] initWithContentsOfFile:fileName];
                [imageAndTextCell setImage:markerImage];
                }
            }
         }
   return cell;
  }

誰かがこれについて私を助けることができますか? tickTracker のインデックス 0 のオブジェクトは、インデックス 1 のオブジェクトをチェックするときに緑に設定されません。

編集1。ティックトラッカーの内部:

-(IBAction)メソッド:(id)送信者{

 NSUInteger idx = [[tableView selectedRowIndexes] firstIndex];

 while (idx != NSNotFound) {
    int rowKey = (int)idx;
    NSNumber* rowNumber = [NSNumber numberWithInt:rowKey];
    [tickTracker addObject:rowNumber];

    idx =[[tableView selectedRowIndexes] indexGreaterThanIndex:idx];



}

}

出力:

  NSLog(@" 123 number %@",[tickTracker objectAtIndex:i]);
  Output: 123 number 2
  NSLog(@" %li value ",row);
  2 value 
4

2 に答える 2

0

1)selectedCarsタイプ NSMutableDictionary のプロパティを宣言します。初期化します。これは「tickTracker」を置き換えます。

2) IBAction は必要ありません。オーバーライドするだけtableViewSelectionDidChangeです:

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
    [selectedCars addObject:@"yes" forKey:[[self tableView] selectedRow];
}

3)dataCellForTableColumn置換で

}else{
             for (int i= 0;i < [tickTracker count];i++){ 
              NSLog(@" 123 number %@",[tickTracker objectAtIndex:i]);
              NSInteger myInteger = [[tickTracker objectAtIndex:i] integerValue];
              [changedRows addObject:[tickTracker objectAtIndex:i]];


            if(row == myInteger){

}else{
   if ([self.selectedCars objectForKey:row]) {
      ... set the tick image ...
   } else {
      ... set the cross image ...
}

4) 行の選択を解除する場合は、...DidChange デリゲート メソッドselectedCarsが既に設定されている場合はチェックインし、true の場合はエントリを削除します。

于 2013-01-31T23:54:56.187 に答える
0
   if([tickTracker containsObject:row]) { 


    }

これで解決した問題です。オブジェクトの行の値が tickTracker 内にある限り、画像を変更します。

于 2013-02-08T02:38:52.523 に答える