2012-06-29 12 views
17

कोको के लिए, मेरे पास NSTableView देखने के लिए सेट है। जब एक पंक्ति का चयन किया जाता है, तो पाठ फ़ील्ड उनके रंग को सफेद में बदल देते हैं। मैं इसे काला कैसे रखूं?पंक्ति चयन पर NSTextField टेक्स्ट रंग कैसे बदलें?

मुझे यह भी ध्यान रखना चाहिए कि हाइलाइट स्रोत सूची पर सेट है (यह नियमित पर एक ही चीज़ है)। Highlight Setting

अचयनित पंक्ति Unselected

चयनित पंक्ति Selected Row

मैं iOS के लिए राज्य config करने के लिए कुछ इसी तरह के लिए उम्मीद की गई थी:

enter image description here

यह WWDC 2011 में सुझाव दिया गया था सत्र 120 लेकिन यह थोड़ा देरी है इसलिए मैं इसका उपयोग नहीं कर रहा हूं। हालांकि यह किसी और के लिए काम कर सकता है।

- (void)tableViewSelectionDidChange:(NSNotification *)notification 
{ 
    [tableView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){ 
     NSTableCellView *cellView = [rowView viewAtColumn:0]; 
     if(rowView.selected){ 
      cellView.textField.font = [NSFont boldSystemFontOfSize:14]; 
     }else{ 
      cellView.textField.font = [NSFont systemFontOfSize:14]; 
     } 
    }]; 
} 
+0

इस मदद करता है:

NSTableCellView उपवर्ग के भीतर निम्नलिखित का उपयोग करें? http://stackoverflow.com/questions/7949015/handling-custom-selection-style-in-view-based-nstableview – Augie

+0

धन्यवाद। जब तक मुझे कुछ याद नहीं आया, वह पृष्ठभूमि रंगों की तरह दिखता है। मैंने पहले से ही अपने कस्टम पृष्ठभूमि रंग के लिए किया है। मैं पाठ के रंग की तलाश में हूं। – joels

+0

पंक्ति को अचयनित करते समय टेक्स्ट फ़ील्ड रंग वापस बदलते हैं? मैं यह समझने की कोशिश कर रहा हूं कि यह कैसे और क्यों हो रहा है। – paulmelnikow

उत्तर

14

इस पर निर्भर करते हुए कि आपको ऐसा करने की आवश्यकता क्यों है, वहां 2 दृष्टिकोण हैं।

आप NSTableRowView उपclass कर सकते हैं और NSBackgroundStyleLight वापस करने के लिए -[NSTableRowView interiorBackgroundStyle] ओवरराइड कर सकते हैं। यह कोशिकाओं को बताएगा कि वे एक हल्के पृष्ठभूमि पर हैं और अंधेरे पाठ को आकर्षित करने के लिए, जो काला होगा।

दूसरा तरीका NSTableCellView को उप-वर्ग करना है और -[NSTableCellView setBackgroundStyle:] ओवरराइड करना है और रंग स्वयं को सेट करें।

11

एनएसटीबलसेलव्यू ओवरराइड करें और सेल का चयन होने पर टेक्स्ट रंग बदलने के लिए इस विधि को जोड़ें।

- (void) setBackgroundStyle:(NSBackgroundStyle)backgroundStyle 
{ 
    NSTableRowView *row = (NSTableRowView*)self.superview; 
    if (row.isSelected) { 
     self.textField.textColor = [NSColor blackColor]; 
    } else { 
     self.textField.textColor = [NSColor whiteColor]; 
    } 

} 
+2

जब कोई चयन होता है तो यह सही ढंग से नहीं खींचा जाता है, फिर भी विंडो कुंजी नहीं है। कोको (10.10 के रूप में) एक ग्रे पृष्ठभूमि खींचेंगे, लेकिन टेक्स्ट फ़ील्ड काला है, इसलिए कस्टम नियंत्रण को "निष्क्रिय" के रूप में आकर्षित करने की आवश्यकता है। पृष्ठभूमि की तुलना करना स्टाइल! = NSBackgroundStyleLight यह निर्धारित करने के लिए कि नियंत्रण सक्रिय रूप से खींचा जाना चाहिए या नहीं। – kainjow

10

इसे पूरा करने के लिए कस्टम कोड की कोई आवश्यकता नहीं है।

इंटरफ़ेस बिल्डर में बस लेबल का रंग "लेबल रंग" पर सेट करें। स्वचालित सफेद/काली चीज़ केवल तभी काम करती है जब लेबल में "कंट्रोल टेक्स्ट कलर" सेट होता है और एनएसटीबलसेल व्यू में होता है।

0

@ sabes के उत्तर के आधार पर, मैंने यह NSTextFieldCell सबक्लास बनाया है जिसका उपयोग आप पंक्तियों का चयन या अचयनित होने पर अपने कस्टम टेक्स्ट रंग सेट करने के लिए कर सकते हैं। आप आईबी में प्रासंगिक टेक्स्ट फ़ील्ड सेल के उप-वर्ग को सेट कर सकते हैं।

@interface SNBlueTextFieldCell : NSTextFieldCell 

@end 

@implementation SNBlueTextFieldCell 

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    [self setTextColor:(backgroundStyle==NSBackgroundStyleDark ? [NSColor blackColor] : [NSColor blueColor])]; 
} 

@end 
1

मैं एक अलग समाधान के साथ आया था। कोको ने @IBOutletCollection का समर्थन किया है तो NSTableCellView उपclassing ठीक होगा। क्योंकि तब मेरे पास एक सेल सबक्लास हो सकता है जिसमें सेल में सभी NSTextFields की एक सरणी हो। लेकिन चूंकि मेरे पास एनएसटीक्स्टफिल्ड्स की विभिन्न संख्याओं के साथ कई प्रकार की कोशिकाएं थीं, इसलिए मुझे यह विकल्प पसंद नहीं आया। इसके बजाय, मैंने NSTableCellView में backgroundStyle संपत्ति के लिए ऐप्पल के दस्तावेज़ों पर एक नज़र डाली।

डिफ़ॉल्ट कार्यान्वयन स्वचालित रूप से सभी subviews कि setBackgroundStyle लागू करने के लिए कॉल अग्रेषित: या एक NSControl, जो NSCell कक्षाएं कि backgroundStyle का जवाब कर रहे हैं।

यदि मेरे टेक्स्टफिल्ड्स सेटबैकग्राउंड स्टाइल लागू करते हैं तो सेल चयन में परिवर्तन होने पर उन्हें अधिसूचित किया जाना चाहिए। हालांकि, पृष्ठभूमि शैली की यह अग्रेषण रिकर्सिव नहीं है।क्योंकि मेरे NSTextFields NSStackViews के भीतर थे, वे संदेश नहीं प्राप्त कर रहे थे। इसके आस-पास पहुंचने के लिए, मैंने बस सभी NSViews पर setBackgroundStyle को लागू करने के लिए एक एक्सटेंशन लिखा है। यह सिर्फ संदेश को आगे बढ़ाता है। अंत में, मैंने इस विधि को लागू करने के लिए NSTextField में एक एक्सटेंशन जोड़ा। इस एक्सटेंशन से, मैं टेक्स्ट रंग बदलता हूं और सुपर कॉल करता हूं। यह समाधान भी अच्छा है क्योंकि कोई सबक्लास की आवश्यकता नहीं है। NSTableCellView या NSTextField के कोई सबक्लास नहीं।

इस कार्यक्षमता को सभी विचारों में जोड़ना और सभी एनएसटीएक्स्टफिल्ड्स एनएसटीक्स्टफिल्ड्स के साथ समस्याएं पैदा कर सकते हैं जो एनएसटीबल व्यू के भीतर नहीं हैं, अप्रत्याशित रूप से रंग बदल रहे हैं। लेकिन अब तक, केवल मेरे टेबल व्यू/आउटलाइन व्यू के भीतर वाले लोग रंग बदल रहे हैं और यही वही है जो मैं ढूंढ रहा था। यदि आप टेक्स्टफिल्ड्स को उस रंग को बदलते हुए देखते हैं जिसे आप उम्मीद नहीं करते हैं, तो आप NSTextField को उपclass करना चाहते हैं और केवल उस सबक्लास पर सेट अप बैकग्राउंड स्टाइल ओवरराइड को सभी NSTextFields में जोड़ने के बजाय इसे ओवरराइड करना चाहते हैं।

स्विफ्ट 3 में कोड का उपयोग मैंने नीचे चिपकाया है।

extension NSView { 
    func setBackgroundStyle(_ newValue: NSBackgroundStyle) { 
     for view in self.subviews { 
      view.setBackgroundStyle(newValue) 
     } 
    } 
} 

extension NSTextField { 
    override func setBackgroundStyle(_ newValue: NSBackgroundStyle) { 
     switch newValue { 
     case .dark: 
      self.textColor = NSColor.controlLightHighlightColor 
     case .light, .lowered, .raised: 
      self.textColor = NSColor.labelColor 
     } 
     super.setBackgroundStyle(newValue) 
    } 
} 
1

मेरे स्विफ्ट ऐप के लिए उपर्युक्त में से कोई भी सही ढंग से काम नहीं कर रहा था। यह विधि एनएसटीबल व्यू को सही ढंग से ध्यान से खो देती है और जब विंडो कुंजी विंडो नहीं होती है लेकिन सेल अभी भी चुना जाता है।

override var backgroundStyle: NSView.BackgroundStyle { 
    willSet { 
    if newValue == .dark { 
     title.textColor = NSColor.white 
    } else { 
     title.textColor = NSColor.labelColor 
    } 
    } 
} 
संबंधित मुद्दे