2010-06-24 14 views
9

NSTextField için seçilen metin arka plan rengini değiştirmeye çalışıyoruz (karanlık bir arayüze sahibiz ve seçilen metin arka planı neredeyse metnin kendisiyle aynıdır), ancak yalnızca NSTextView bunu değiştirmemize izin veriyor gibi görünüyor.Güzel renklendirme elde etmek için NSTextView kullanarak bir NSTextField öğesini yayınlama?

Yani NSTextView kullanarak bir NSTextField sahtesini yapmaya çalışıyoruz, ancak aynı işi yapmak için metin kaydırma yapamıyoruz.

aldığımız en yakın bu kodla geçerli:

NSTextView *tf = [ [ NSTextView alloc ] initWithFrame: NSMakeRect(30.0, 20.0, 80.0, 22.0) ]; 

// Dark UI 
[tf setTextColor:[NSColor whiteColor]]; 
[tf setBackgroundColor:[NSColor darkGrayColor]]; 

// Fixed size 
[tf setVerticallyResizable:FALSE]; 
[tf setHorizontallyResizable:FALSE]; 

[tf setAlignment:NSRightTextAlignment]; // Make it right-aligned (yup, we need this too) 

[[tf textContainer] setContainerSize:NSMakeSize(2000, 20)]; // Try to Avoid line wrapping with this ugly hack 
[tf setFieldEditor:TRUE]; // Make Return key accept the textfield 

// Set text properties 
NSMutableDictionary *dict = [[[tf selectedTextAttributes] mutableCopy ] autorelease]; 
[dict setObject:[NSColor orangeColor] forKey:NSBackgroundColorAttributeName]; 
[tf setSelectedTextAttributes:dict]; 

Bu işleri neredeyse tamam metin uzun metin alanına daha uzunsa, herhangi bir şekilde ilerleyip edemez hariç.

Bunu nasıl gerçekleştireceğiniz konusunda bir fikriniz var mı? peşin

Teşekkür

Düzenleme: Çözüm Joshua Joshua Nozzi

üyeye aşağıda önerilen, bu büyük bir çözümdür ı aradığı şeyi:

@interface ColoredTextField : NSTextField 
- (BOOL)becomeFirstResponder; 
@end 

@implementation ColoredTextField 
- (BOOL)becomeFirstResponder 
{ 
    if (![super becomeFirstResponder]) 
     return NO; 

    NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys : 
        [NSColor orangeColor], NSBackgroundColorAttributeName, nil]; 

    NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self]; 
    [fieldEditor setSelectedTextAttributes:attributes]; 
    return YES; 
} 
@end 

yerine taklit Bir NSTextView ile, sadece ilk cevaplayıcı olduğunda seçilen metin rengini değiştiren bir NSTextField var.

Düzelt: Yukarıdaki kod, metin alanına Enter tuşuna bastığınızda varsayılan seçim rengine geri döner. Bundan kaçınmanın bir yolu.

@interface ColoredTextField : NSTextField 
- (BOOL)becomeFirstResponder; 
- (void)textDidEndEditing:(NSNotification *)notification; 

- (void)setSelectedColor; 
@end 

@implementation ColoredTextField 
- (BOOL)becomeFirstResponder 
{ 
    if (![super becomeFirstResponder]) 
     return NO; 
    [self setSelectedColor]; 
    return YES; 
} 

- (void)textDidEndEditing:(NSNotification *)notification 
{ 
    [super textDidEndEditing:notification]; 
    [self setSelectedColor]; 
} 

- (void) setSelectedColor 
{ 
    NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys : 
           [NSColor orangeColor], NSBackgroundColorAttributeName, nil]; 

    NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES forObject:self]; 
    [fieldEditor setSelectedTextAttributes:attributes]; 
} 
@end 
sadece metin alanı en field editor özelliklerini ayarlanmamış Neden

cevap

6

doğrudan zaman alan becomes first responder? Tipik bir metin alanına

gitmeyeceklerini, seçim alanı ilk savunan konumdayken görünür, yani metin alanın saha editörü sorarsanız, o zaman onun seçilen metin niteliklerini , aynı etkiler olacaktı set sen misin

NSDictionary * attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSColor orangeColor], NSBackgroundColorAttributeName, nil]; 
NSTextView * fieldEditor = (NSTextView *)[[self window] fieldEditor:YES 
    forObject:textField]; 
[fieldEditor setSelectedTextAttributes:attributes]; 

Not: Aşağıdaki açıklamalarda tarif edildiği gibi, belgeler alan düzenleyici NSTextView bir örneğidir söyleyerek doğru olmakla birlikte, - [NSWindow fieldEditor: forObject:] yöntemi NSText geri iddia (NSTextView'ın anlık süper sınıfı). Alan düzenleyicisi NSTextView yöntemlerini göndermeyi planlıyorsanız, derleyicinin uyarılarını susturmak için bir NSTextView dosyası olarak yayınlamanız gerekir. Döküm, kodunuzda bir şey kırmayacak, yöntem prototipinin gelecekte düzeltilmesi gerektiğinden, güvenli bir şekilde yerinde bırakılabilir.

+0

Bu cevaba bir başka soruya bir bakın. Bir NSTokenField (NSTextField'ın bir alt sınıfı olan alan düzenleyicisini nasıl manipüle edeceğini gösterir, bu nedenle tam olarak aynı şekilde çalışır). http://stackoverflow.com/questions/2995205/prevent-selecting-all-tokens-in-nstokenfield –

+0

Metin alanının alan düzenleyicisi bir NSText nesnesidir ve bu sınıfta setSelectedTextAttributes yöntemi yoktur. Bir şeyi kaçırmadığım sürece, bu şekilde yapılabilir gibi görünmüyor. – hasvn

+0

@hasvn: Bu kafa karıştırıcı ... '- [NSWindow alanEditor: forObject:] için prototipin 'NSText *' döndürdüğünü, ancak belgelerin alan düzenleyicisinin bir NSTextView nesnesi olduğunu söylüyor. – JWWalker

İlgili konular