2012-12-06 16 views
5

मैंने एक ही कॉलम के साथ व्यू-आधारितNSTableView बनाया है। यह कॉलम इंटरफ़ेस बिल्डर से मानक NSTableCellView के साथ पॉप्युलेट किया गया है (मैंने छवि और टेक्स्टफील्ड के साथ संस्करण चुना है)।एक NSTableCellView संपादन योग्य

अब मैं टेक्स्टफील्ड कॉलम संपादन योग्य में बनाना चाहता हूं।

मेरा पहला प्रयास इंटरफेस बिल्डर से NSTextField को संशोधित करना था और इसके व्यवहार को Editable के रूप में सेट करना था। यह काम करता है, वास्तव में जब मैं एक पंक्ति का चयन करता हूं और मैं enter key दबाता हूं तो फ़ील्ड संपादन योग्य हो जाता है और मैं इसका मूल्य बदल सकता हूं। मैंने सोचा कि मैं NSTableViewDataSource विधि tableView:setObjectValue:forTableColumn:row: जैसे इस परिवर्तन को रोकने में सक्षम हूं, लेकिन इस विधि को टेक्स्टफील्ड एडिट एक्शन के जवाब में कभी भी कॉल नहीं किया जाता है।

दृश्य-आधारित एनएसटीबल व्यू सिस्टम में संपादन योग्य फ़ील्ड से निपटने का सही तरीका कौन सा है? मुझे लगता है कि NSTableViewDataSource के साथ कुछ करने के लिए कुछ है लेकिन मुझे नहीं पता कि इसकी विधियों को कैसे प्राप्त किया जाए।

+0

आप कहते हैं कि नहीं है * क्यों * यदि आप संपादित रोकना चाहते हैं? – trojanfoe

+0

क्योंकि मुझे डेटा स्रोत में डेटा संपादित करने के लिए मान का उपयोग करने की आवश्यकता है। – MatterGoal

उत्तर

1

लगता है जैसे आपको को उपclass करने की आवश्यकता है जो NSTableView सेल में है और उप-वर्गीकृत दृश्य को टेक्स्टफील्ड का प्रतिनिधि बनाते हैं। आपके विचार तो NSTextField प्रतिनिधि विधि के माध्यम से पाठ परिवर्तन सूचनाएं मिल जाएगा:

- (void)textDidChange:(NSNotification *)notification; 
3

NSTableCellView का एक उपवर्ग बनाएँ। (उचित। एच और। एम फाइलें) कक्षा को NSTextFieldDelegate प्रोटोकॉल का जवाब दें। नियंत्रण लागू करें: textShouldEndEditing: विधि। इस सबक्लास को अपने लेबल नियंत्रण के प्रतिनिधि बनाएं।

यहां कुछ उदाहरण कोड है।

CategoryListCell.h

@interface CategoryListCell : NSTableCellView 
@end 

CategoryListCell.m

@interface CategoryListCell()<NSTextFieldDelegate> 
@property (weak) IBOutlet NSTextField *categoryLabel; 
@property (assign) BOOL editing; 
@property (copy) NSString* category; 
@end 

@implementation CategoryListCell 
- (BOOL)control:(NSControl*)control textShouldBeginEditing:(NSText *)fieldEditor { 
    self.editing = YES; 
    return YES; 
} 

- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor; { 
    if (self.editing) { 
     self.editing = NO; 
     [self mergeFromSource:self.category toDestination:self.categoryLabel.stringValue]; 
    } 
    return YES; 
} 

- (void)mergeFromSource:(NSString*)source toDestination:(NSString*) destination { 
// your work here 
} 

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