2010-06-24 13 views
9

एक NSTextField के लिए चयनित टेक्स्ट पृष्ठभूमि रंग बदलने की कोशिश कर रहा है (हमारे पास एक अंधेरा यूआई है, और चयनित टेक्स्ट पृष्ठभूमि लगभग पाठ के समान ही है), लेकिन केवल NSTextView हमें इसे बदलने की अनुमति देता है।अच्छा रंग पाने के लिए एक NSTextView का उपयोग कर एक NSTextField को फिक्र करना?

तो हम एक NSTextView का उपयोग करके एक NSTextField नकली करने की कोशिश कर रहे हैं, लेकिन इसे काम करने के लिए टेक्स्ट स्क्रॉलिंग नहीं मिल सकती है।

करीबी पर हम पाते हैं इस कोड के साथ है:

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]; 

यह काम करता है लगभग ठीक, सिवाय इसके कि यदि पाठ पाठ क्षेत्र से अधिक लंबी है, तो आप किसी भी तरह से यह करने के लिए स्क्रॉल नहीं कर सकते।

कोई विचार यह कैसे पूरा किया जाए?

अग्रिम धन्यवाद

संपादित करें: समाधान द्वारा Joshua Nozzi

यहोशू के लिए धन्यवाद नीचे का सुझाव दिया है, इस के लिए एक महान समाधान है कि मैं क्या तलाश कर रहा था:

@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 

के बजाय faking यह एक NSTextView के साथ, यह केवल एक NSTextField है जो चयनित पाठ रंग को बदलता है जब यह पहली प्रतिक्रियाकर्ता बन जाता है।

संपादित करें: उपरोक्त कोड टेक्स्टफ़ील्ड में एंटर दबाए जाने के बाद डिफ़ॉल्ट चयन रंग पर वापस आ जाता है। इससे बचने का एक तरीका यहां दिया गया है।

@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 

उत्तर

6

क्यों न सिर्फ पाठ क्षेत्र के field editor के गुण सेट सीधे जब क्षेत्र becomes first responder?

एक विशिष्ट पाठ फ़ील्ड में, चयन ही दिखाई जब क्षेत्र पहले प्रत्युत्तर है, इसलिए यदि आप पाठ क्षेत्र के क्षेत्र संपादक के लिए पूछना है, तो सेट अपने चयनित पाठ विशेषताओं, आप एक ही प्रभावित कर पाने चाहते हैं, wouldn तुम नहीं हो

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

नोट: के रूप में नीचे टिप्पणी में चर्चा की, प्रलेखन कह क्षेत्र संपादक NSTextView का एक उदाहरण है में सही है, लेकिन - [NSWindow fieldEditor: forObject:] विधि एक NSText वापसी का दावा करता है (NSTextView का तत्काल सुपरक्लास)। यदि आप फ़ील्ड एडिटर NSTextView-only विधियों को भेजने की योजना बना रहे हैं, तो आपको कंपाइलर की चेतावनियों को शांत करने के लिए इसे NSTextView के रूप में डालना होगा। कास्टिंग आपके कोड में कुछ भी तोड़ नहीं देगा, क्या भविष्य में विधि प्रोटोटाइप को सही किया जाना चाहिए, इसलिए इसे सुरक्षित रूप से जगह में छोड़ा जा सकता है।

+0

इस उत्तर को किसी अन्य प्रश्न पर देखें। यह दिखाता है कि एनएसटीकेनफ़िल्ल्ड के लिए फ़ील्ड एडिटर में हेरफेर कैसे करें (जो एनएसटीक्स्टफिल्ड का उप-वर्ग है, इसलिए यह बिल्कुल वैसे ही काम करता है)। http://stackoverflow.com/questions/2995205/prevent-selecting-all-tokens-in-nstokenfield –

+0

टेक्स्ट फ़ील्ड का फ़ील्ड एडिटर एक एनएसटीएक्स्ट ऑब्जेक्ट है, और उस वर्ग में setSelectedTextAttributes विधि नहीं है। जब तक मुझे कुछ याद नहीं आ रहा है, ऐसा प्रतीत नहीं होता है कि यह इस तरह से किया जा सकता है। – hasvn

+0

@ हसन: यह भ्रमित है ... '- [NSWindow फ़ील्ड एडिटर: forObject:] 'के लिए प्रोटोटाइप कहता है कि यह' NSText * 'देता है, लेकिन प्रलेखन कहता है कि फ़ील्ड एडिटर एक NSTextView ऑब्जेक्ट है। – JWWalker

संबंधित मुद्दे