2012-09-04 30 views
5

का उपयोग करते समय दृश्य आधारित NSTableView में NSTableCellView से किसी क्रिया को ट्रिगर कैसे करें I 10.8 पर चल रहे व्यू-आधारित NSTableView के साथ समस्या का सामना करना पड़ रहा है (लक्ष्य 10.7 है, लेकिन मुझे लगता है कि यह प्रासंगिक नहीं है)।बाइंडिंग

मैं एक एनएसटीबल व्यू का उपयोग कर रहा हूं, और मुझे बाइंडिंग के माध्यम से मेरे कस्टम एनएसटीबलसेलव्यू के लिए सामग्री मान मिलते हैं। मैं अपना डेटा प्राप्त करने के लिए NSTableCellView के obejctValue का उपयोग करता हूं।

मैंने अपने सेल में एक बटन जोड़ा, और मैं इसे क्लिक करते समय कुछ क्रियाओं को ट्रिगर करना चाहता हूं। अब तक मैं केवल कस्टम NSTableCellView के उप-वर्ग के भीतर एक क्रिया को ट्रिगर करने में सक्षम हूं।

NSButton *myButton = (NSButton*)sender;  

NSTableView *myView = (NSTableView*)myButton.superview.superview.superview; 

NSInteger rowClicked = [myView rowForView:myButton.superview]; 

वहां से मैं अपने अनुप्रयोग प्रतिनिधि या नियंत्रक जहां कार्रवाई परिभाषित किया गया है तक पहुँचने के लिए पता नहीं है:

मैं पंक्ति है कि इस तरह क्लिक किया गया था, श्रृंखला का उपयोग कर प्राप्त कर सकते हैं।

जैसा कि मैं कोको बाइंडिंग का उपयोग कर रहा हूं, मेरे पास एनएसटीबल व्यू पर एक प्रतिनिधि नहीं है जिसे मैं अपनी क्रिया को ट्रिगर करने के लिए उपयोग कर सकता हूं।

क्या आपको कोई विचार है कि मैं नियंत्रक से वापस कैसे बात कर सकता हूं?

अग्रिम में बहुत धन्यवाद!

उत्तर

2

हालांकि आप बाइंडिंग का उपयोग कर रहे हैं, फिर भी आप इंटरफ़ेस बिल्डर में अपने टेबलव्यू के प्रतिनिधि के रूप में अपने नियंत्रक को सेट कर सकते हैं।

मुझे लगता है कि आप पहले से ही अपने सेल के अंदर से तालिका दृश्य तक पहुंचने में सक्षम हैं। अगला कार्य सरल होना चाहिए, बस तालिका दृश्य प्रतिनिधि को अपने बटन की कार्रवाई के लक्ष्य के रूप में सेट करें।

+0

धन्यवाद, आपको यह तरीका मिला है। वास्तव में सेल की आपूर्ति करके पहले परेशान था। लेकिन यह ठीक काम करता है। –

3

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

यह जानने के लिए कि आपके एनएसटीबल व्यू पर कौन सी पंक्ति संख्या है, अपने समाधान को संबोधित करने के लिए सबसे पहले।

- (NSInteger)myRowNumber 
{ 
    return [(NSTableView*)self.superview.superview rowForView:self]; 
} 

इस ठीक काम करता है, लेकिन यह मजबूत की तुलना में कम है: मैं NSTableView मैं एक पहला प्रयास के रूप में निम्नलिखित स्थापित बटन जानने के बिना यह पता लगाने के लिए, अपने कस्टम में सक्षम था। यह केवल तभी काम करता है यदि आप पहले ही जानते हैं कि आप दृश्य पदानुक्रम में कितने गहरे हैं। एक और अधिक मजबूत और सार्वभौमिक समाधान है:

- (NSInteger)myRowNumber 
{ 
    NSTableView* tableView = nil; 
    NSView* mySuperview = self; 

    do 
    { 
     NSView* nextSuper = mySuperview.superview; 
     if (nextSuper == nil) 
     { 
      NSException *exception = 
       [NSException exceptionWithName:@"NSTableView not found." 
        reason:[NSString stringWithFormat:@"%@ search went too deep.", 
        NSStringFromSelector(_cmd)] userInfo:nil]; 
      @throw exception; 
     } 

     if ([nextSuper isKindOfClass:[NSTableView class]]) 
      tableView = (NSTableView*)nextSuper; 
     else 
      mySuperview = mySuperview.superview; 
    } while (tableView == nil); 

    return [tableView rowForView:self]; 
} 

इस न केवल NSTableView स्तर पर काम करता है, लेकिन यह ऊपर किसी भी स्तर पर स्थापित कुछ भी साथ कैसे जटिल दृश्य पदानुक्रम काम करता है, कोई फर्क नहीं पड़ता।

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

[self.myDoc doSomethingToRow:self.myRowNumber]; 

मैंने इसका परीक्षण किया और यह एनएसटीबल व्यू के ऊपर दृश्य पदानुक्रम के विभिन्न स्तरों पर काम करता है। और यह पहले पंक्ति को चुनने के बिना काम करता है (जो एप्पल दस्तावेज में माना जाता है)।

सादर, जार्ज लॉरेंस तूफान, मौल्टबाई, वाशिंगटन, संयुक्त राज्य अमेरिका

1

उपयोग rowForView: और प्रत्युत्तर श्रृंखला

एक नियंत्रण की कार्रवाई एक NSTableCellView भीतर एम्बेडेड का जवाब करने के लिए, नियंत्रण सबसे पहले करने के लिए कार्रवाई जारी करना चाहिए उत्तरदाता। वैकल्पिक रूप से, फ़ाइल स्वामी संभव है लेकिन यह अधिक कसकर युग्मित है।

- (IBAction)revealInFinder:(id)sender { 
    NSInteger row = [self.tableView rowForView:sender]; 
    ... 
} 

कार्रवाई प्रत्युत्तर श्रृंखला वर्गों में से किसी के भीतर कार्यान्वित किया जाता है:

उपयोग rowForView: कार्रवाई विधि के भीतर जो पंक्ति के नियंत्रण से निर्धारित करने के लिए कार्रवाई जारी किए हैं। सबसे अधिक संभावना है, यह आपके उप-वर्गीकृत NSWindowController उदाहरण होगा। उत्तरदाता भी आवेदन प्रतिनिधि हो सकता है; मानते हैं कि प्रतिनिधि के पास NSTableView से बात करने का साधन है।

कार्रवाई में यह देखने के लिए ऐप्पल का उदाहरण TableViewPlayground: Using View-Based NSTableView and NSOutlineView देखें।

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

  • कोई संबंधित समस्या नहीं^_^