2011-07-29 4 views
7

Hücre (yani satır) seçildiğinde (örn. Highlighted true) ve her şey düzgün çalışıyorsa, özel bir ön plan rengi çizmek için bir NSTextFieldCell (bir NSTableView içinde) alt sınıfına girdim.NSTextFieldCell öğesinin ne zaman odaklanacağını belirlemek için odaklanma yok mu?

Tablo görünümü odağı kaybettiğinde sorun seçili satırları farklı bir renkle çizmek istiyorum, hücre içeren tablo görünümünün drawWithFrame içindeki ilk yanıtlayıcı olup olmadığını nasıl belirleyebilirim: (NSRect) cellFrame InView: (NSView *) controlView?

Benim geçerli kod ben firstResponder kullanan bir çözüm bulduk

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { 
     NSColor* textColor = [self isHighlighted] 
       ? [NSColor alternateSelectedControlTextColor] 
       : [NSColor darkGrayColor]; 
} 
+0

Ben de gerçekten buna bir cevap istiyorum anahtar olup olmadığını kontrol etmek gerekir birden fazla pencere var ancak eğer, mükemmel! –

cevap

5

değil buldum iyi yolu (bazen controlView'un superview'i cevaplayıcı veya bazı saçmalıktır) yanıtlayıcılarla başa çıkmanızı sağlar editörü kullanmaktır:

Bu kadar kolay!

+1

Soru oldukça eski ve söylediğin gibi çözdüm teşekkürler, cevap kabul edilir :) – dafi

+0

Ve ayrıca pencere anahtarı kontrol edin? Yoksa bu gereksiz mi? '&& [self.window isKeyWindow]' – Gabriel

3

, bu basit ve etkili görünüyor

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { 
     NSColor* textColor; 

     if ([self isHighlighted]) { 
      textColor = [[controlView window] firstResponder] == controlView 
        ? [NSColor alternateSelectedControlTextColor] 
        : [NSColor yellowColor]; 
     } else { 
      textColor = [NSColor darkGrayColor]; 
     } 

     // use textColor 
     ... 
     ... 
     [super drawWithFrame:cellFrame inView:controlView]; 
    } 
+0

Bunu da buldum, ancak uygulama devre dışı bırakıldığında durumu kontrol etmiyor. Daha iyi bir yol olmadığına inanamıyorum. –

+1

Sadece bildirimi işlemek üzere yapılandırdığınız yöntemde tablo görünümünde 'NSApplicationDidResignActiveNotification' ve' NSApplicationDidBecomeActiveNotification' için kayıtlara ve sonra da '-setNeedsDisplay:' öğesine çağrı yapmalısınız. –

+0

Ve sanırım pencereler aktif ve inaktif hale geliyor mu? Standart bir hücre odaklama işi için yapacak çok şey gibi görünüyor. AppKit'in içinde daha iyi bir yol olmalı… Ya da onu bir bileşen/kategori içine yerleştirmek için zaman. –

2

bir şey daha, yukarıdaki kod penceresi

 if (controlView && ([[controlView window] firstResponder] == controlView) && [[controlView window] isKeyWindow]) { 
      [attributes setObject:[NSColor whiteColor] forKey:NSForegroundColorAttributeName]; 
     }