2009-05-27 13 views
10

मेरे पास तालिका दृश्य में एक टेक्स्ट फ़ील्ड सेल है, जिसमें से संपादन को समाप्त होने पर मुझे जागरूक होने की आवश्यकता है। मैंने सोचा कि मैं अपने कंट्रोलर क्लास को टेक्स्ट फ़ील्ड सेल के प्रतिनिधि के रूप में सेट कर दूंगा, और उसके बाद एनएसटीक्स्टफिल्ड के प्रतिनिधि विधि टेक्स्टडिडएंड एडिटिंग का उपयोग करूंगा: लेकिन मुझे एहसास हुआ कि टेक्स्ट फ़ील्ड सेल में प्रतिनिधि विधियां नहीं लगती हैं? यह क्यों है, और संपादन पूरा होने पर मुझे सूचित किया जा सकता है (subclassing के अलावा)?NSTextFieldCell प्रतिनिधि?

धन्यवाद NSCell से

उत्तर

14

NSTextFieldCell inherits (अच्छी तरह से, NSActionCell जो NSCell से विरासत से तकनीकी रूप से)। NSCell वर्ग (docs से) करने के लिए प्रयोग किया जाता है:

NSCell वर्ग एक पूर्ण NSView उपवर्ग की भूमि के ऊपर के बिना एक NSView वस्तु में पाठ या छवियों को प्रदर्शित करने के लिए एक तंत्र प्रदान करता है।

विशेष रूप से, सेल वर्ग के लिए "पाठ या छवियों को प्रदर्शित", और उपयोगकर्ता के साथ बातचीत के साथ काम नहीं किया जाता है। इसी प्रकार, NSTextField वर्ग के साथ:

एनएसटीक्स्टफाल्ड क्लास अपने उपयोगकर्ता इंटरफ़ेस को लागू करने के लिए NSTextFieldCell क्लास का उपयोग करता है।

वास्तविक उपयोगकर्ता इनपुट के साथ NSTextField सौदों, पाठ क्षेत्र सेल का उपयोग बस अपने यूजर इंटरफेस को लागू करने, और इसी प्रकार, प्रतिनिधि तरीकों अधिसूचना जब पाठ का संपादन NSTextField वर्ग के माध्यम से प्रदान की जाती है समाप्त हो गया है प्रदान करने के लिए, जबकि और NSTextFieldCell कक्षा के माध्यम से नहीं।

आप जब संपादन एक NSTableView में समाप्त होता है की सूचना प्राप्त करना चाहते हैं, तो आप के एक पर्यवेक्षक के रूप में अपने आप को रजिस्टर करने की आवश्यकता NSTextDidEndEditingNotification (आप NSNotificationCenter वर्ग संदर्भ पढ़ने के लिए अगर आप अधिसूचना के साथ अपरिचित हैं चाहते हो सकता है)। ऐसा करने के लिए, निम्नलिखित को अपने नियंत्रक वर्ग में रखें;

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self 
     selector:@selector(textDidEndEditing:) 
      name:NSTextDidEndEditingNotification 
     object:tableView]; 

tableView जहाँ आपके NSTableView वस्तु के लिए सूचक है: awakeFromNib समारोह इसे शामिल करने के लिए सुनिश्चित करें कि आपके एप्लिकेशन के स्टार्टअप आह्वान किया जाता है एक अच्छी जगह है। फिर, बस विधि इस प्रकार लागू:

- (void)textDidEndEditing:(NSNotification *)aNotification 
{ 
    // Do what you want here 
} 

मत भूलना आवंटन रद्द करने पर एक पर्यवेक्षक के रूप में अपने आप को दूर करने के लिए:

- (void)dealloc 
{ 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc removeObserver:self]; 
} 

कारण यह है कि आप उद्देश्य यह है कि आप होने के लिए देख रहे हैं सेट NSTableView उदाहरण (और सेल स्वयं नहीं) यह है कि हुड के नीचे, जब आप तालिका में एक सेल संपादित करते हैं, तो जिस सेल से आप काम कर रहे हैं उसे सीधे संपादित नहीं किया जा रहा है; यह खिड़की (या एक कस्टम) क्षेत्र संपादक है। संपादन समाप्त होने पर, फ़ील्ड एडिटर तब उस सेल के लिए टेबल व्यू पर नया मान पास करता है। हालांकि तालिका दृश्य यह कहने के लिए अधिसूचना पोस्ट करेगा कि एक सेल संपादित किया जा चुका है।

+0

मैंने पाया कि "TextDidEndEditing:" विधि काम करती है, लेकिन "TextDidBegin संपादन:" विधि नहीं। क्या तुम्हारे पास कोई विचार है? – Yun

0

NSTableViewDataSource प्रोटोकॉल में tableView:setObjectValue:forTableColumn:row: विधि लागू करें। इसे tableView:objectValueForTableColumn:row: विधि के आगे रखें जिसे आपने पहले ही कार्यान्वित कर दिया है।

- (void)tableView:(NSTableView *)aTableView 
    setObjectValue:(id)anObject 
    forTableColumn:(NSTableColumn *)aTableColumn 
       row:(NSInteger)rowIndex 
{ 
    [mutableArrayWithStrings replaceObjectAtIndex:rowIndex withObject:anObject]; 
} 
संबंधित मुद्दे