2012-04-17 10 views
5

मेरे पास एक व्यू-आधारित सिंगल-कॉलम NSTableView है। मेरे NSTableCellView सबक्लास के अंदर मेरे पास एक NSTextView है जो चयन योग्य है, लेकिन संपादन योग्य नहीं है।NSTableVellView के अंदर NSTextView पर क्लिक करते समय एनएसटीबल व्यू में एक पंक्ति का चयन कैसे करें?

जब उपयोगकर्ता सीधे NSTableCellView पर क्लिक करता है, तो पंक्ति ठीक से हाइलाइट करती है। लेकिन जब उपयोगकर्ता उस NSTextVellView के अंदर NSTextView पर क्लिक करता है, तो पंक्ति हाइलाइट नहीं होती है।

एनएसटीएक्स्टव्यू व्यू पर क्लिक करने के लिए मैं एनएसटीएक्स्टव्यू पर क्लिक कैसे प्राप्त करूं ताकि पंक्ति हाइलाइट हो?

क्लास पदानुक्रम लगता है: NSScrollView> NSTableView> NSTableColumn> NSTableCellView> NSTextView

+0

मैं तुम क्या देख रहे हैं नहीं हो सकता। जब मैं एक दृश्य आधारित सेल में एक टेक्स्ट फ़ील्ड जोड़ता हूं, तो उस पर क्लिक करने से पंक्ति फ़ील्ड नहीं होती है (मुझे ऐसा करने के लिए फिर से क्लिक करना होगा)। क्या आपके पास यह कुछ भी बाध्य है, या आप डेटा स्रोत का उपयोग कर रहे हैं? – rdelmar

+0

मैं NSTextView का उपयोग कर रहा हूं, न कि NSTextField। हां, मुझे वही व्यवहार मिलता है जैसा आप टेक्स्टफील्ड के साथ करते हैं, लेकिन मेरे एप्लिकेशन को टेक्स्टव्यू की आवश्यकता होती है। – sam

उत्तर

6

यहाँ मैं क्या कर समाप्त हो गया है। मैं NSTextView का एक उपवर्ग बना दिया है और mousedown overrode: इस प्रकार है ...

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    // Notify delegate that this text view was clicked and then 
    // handled the click natively as well. 
    [[self myTextViewDelegate] didClickMyTextView:self]; 
    [super mouseDown:theEvent]; 
} 

मैं NSTextView के मानक प्रतिनिधि ... पुन: उपयोग कर रहा हूँ

- (id<MyTextViewDelegate>)myTextViewDelegate 
{ 
    // See the following for info on formal protocols: 
    // stackoverflow.com/questions/4635845/how-to-add-a-method-to-an-existing-protocol-in-cocoa 
    if ([self.delegate conformsToProtocol:@protocol(MyTextViewDelegate)]) { 
     return (id<MyTextViewDelegate>)self.delegate; 
    } 
    return nil; 
} 

और शीर्ष लेख में ...

@protocol MyTextViewDelegate <NSTextViewDelegate> 
- (void)didClickMyTextView:(id)sender; 
@end 

प्रतिनिधि में, मैंने पंक्ति का चयन करने के लिए didClickMyTextView लागू किया।

- (void)didClickMyTextView:(id)sender 
{ 
    // User clicked a text view. Select its underlying row. 
    [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:[self.tableView rowForView:sender]] byExtendingSelection:NO]; 
} 
+0

नीट - एक ही घटना से दो गैर-विरोधाभासी कार्रवाइयां। आपने एक डिज़ाइन पैटर्न बनाया है जो कई परिस्थितियों में लागू हो सकता है। – Wienke

+0

सभी समस्याओं, महान समाधान के लिए एक जवाब। – mohacs

0

मुझे लगता है कि आप अनिवार्य रूप से एक ही समस्या मैं यहाँ पड़ा है: pass event on। स्वीकृत उत्तर देखें।

एक ही पैटर्न के बाद, आप NSTextView उपवर्ग और - (void)mouseUp:(NSEvent *)theEvent ओवरराइड superView, जो मैं कर रहा हूँ संभालने के लिए पर घटना पारित करने के लिए होगा tableView है:

- (void)mouseUp:(NSEvent *)theEvent { 
    [superView mouseUp:theEvent]; 
} 
+1

कोई भाग्य नहीं। माउस ओवरराइड करना: और सुपरव्यू में ईवेंट भेजना कुछ भी प्रतीत नहीं होता है। फिर मैंने माउसडाउन ओवरराइड करने की कोशिश की: और सुपरव्यू में ईवेंट भेजना। वह पंक्ति का चयन करता है, लेकिन फिर मैं पाठ का चयन करने की क्षमता खो देता हूं (मूल रूप से टेक्स्टव्यू की माउस कार्यक्षमता)। मैंने इसे अपने उत्तर में वर्णित के रूप में हल किया है और यह आपके मन में जो कुछ भी था उससे अलग नहीं है। – sam

1

या, एक NSTextField उपयोग करते हैं, और फिर,

textfield.bezeled = NO; 
textfield.drawsBackground = NO; 
textfield.editable = NO; 
textfield.selectable = YES; 
[textfield setRefusesFirstResponder: YES]; 
संबंधित मुद्दे