2011-12-13 34 views
9

क्या कोई ऐसी आईडी है जिसका उपयोग एक्सकोड के माध्यम से .nib/.xib में किया जा सकता है और कोड से किसी विशेष दृश्य उदाहरण की पहचान करने के लिए रनटाइम पर पूछताछ की जा सकती है?NSViews पर अद्वितीय आईडी

विशेष रूप से जब हमारे इंटरफ़ेस में एक ही NSView उपclass की कई प्रतियां होती हैं तो हम कैसे बता सकते हैं कि हम वर्तमान में किस पर देख रहे हैं?

उत्तर

9

जेनेरिक NSView ऑब्जेक्ट्स में इंटरफेस बिल्डर में tag प्रॉपर्टी सेट नहीं हो सकता है। NSView पर विधि केवल पढ़ने योग्य विधि है और केवल NSView के उप-वर्गों में लागू की जा सकती है। NSViewsetTag: विधि लागू नहीं करता है।

मुझे लगता है अन्य उत्तर NSControl जो एक -setTag: पद्धति निर्धारित करता है और आप टैग निर्धारित करने की अनुमति के लिए एक इंटरफेस बिल्डर क्षेत्र है के उदाहरण की बात कर रहे।

आप सामान्य विचारों के साथ उपयोगकर्ता परिभाषित रनटाइम विशेषताओं का उपयोग कर सकते हैं। यह आपको अपनी दृश्य वस्तु में गुणों के मानों को पूर्व-निर्धारित करने की अनुमति देता है। तो अगर आपके विचार तो जैसे एक संपत्ति परिभाषित:

@property (strong) NSNumber* viewID; 
फिर इंटरफ़ेस बिल्डर में पहचान निरीक्षक के उपयोगकर्ता परिभाषित विशेषताओं अनुभाग में

, आप मुख्यपथ viewID, प्रकार Number और मूल्य के साथ एक संपत्ति जोड़ सकते हैं 123

आपके विचार में -awakeFromNib विधि, तो आप संपत्ति के मूल्य तक पहुंच सकते हैं। आप पाएंगे कि ऊपर दिए गए उदाहरण में, viewID आपके दृश्य की संपत्ति 123 पर प्री-सेट हो गई होगी।

+0

यह बहुत अच्छा लगता है, संकेत के लिए धन्यवाद! मैं कोशिश करूँगा। हां, वेनिला कोको एनएसवीव में पूर्व-परिभाषित कुछ भी नहीं है जिसका उपयोग किया जा सकता है लेकिन मुझे लगता है कि मैं अभी भी पावरप्लेंट/एमएफसी तरीके से बहुत ज्यादा सोच रहा हूं ;-) – Jay

+1

नीचे दिए गए उत्तर सामान्य दृश्य के लिए काम करता है। बस xib में पहचानकर्ता सेट करें और इसे प्रोग्राम के साथ प्रोग्रामेटिक रूप से एक्सेस करें। पहचानकर्ता – Colin

+0

कोई विचार एनएसवी व्यू में टैग के पीछे तर्क के पीछे तर्क क्या है? – Mercurial

10

इंटरफ़ेस बिल्डर में, एनएसवी व्यू के "पहचानकर्ता" को सेट करने का एक तरीका है। इस मामले में, मैं पहचानकर्ता स्ट्रिंग के रूप में पहचानकर्ता "54321" का उपयोग करूंगा।

एनएसवी व्यू NSUserInterfaceItemIdentification Protocol पर अनुरूप है, जो एनएसएसटींग के रूप में एक अद्वितीय पहचानकर्ता है। आप दृश्य पदानुक्रम के माध्यम से चल सकते हैं और उस पहचानकर्ता के साथ एनएसवी व्यू ढूंढ सकते हैं।

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSView *viewToFind = [self viewWithIdentifier:@"54321"]; 
} 

- (NSView *)viewWithIdentifier:(NSString *)identifier 
{ 
    NSArray *subviews = [self allSubviewsInView:self.window.contentView]; 

    for (NSView *view in subviews) { 
     if ([view.identifier isEqualToString:identifier]) { 
      return view; 
     } 
    } 

    return nil; 
} 

- (NSMutableArray *)allSubviewsInView:(NSView *)parentView { 

    NSMutableArray *allSubviews  = [[NSMutableArray alloc] initWithObjects: nil]; 
    NSMutableArray *currentSubviews = [[NSMutableArray alloc] initWithObjects: parentView, nil]; 
    NSMutableArray *newSubviews  = [[NSMutableArray alloc] initWithObjects: parentView, nil]; 

    while (newSubviews.count) { 
     [newSubviews removeAllObjects]; 

     for (NSView *view in currentSubviews) { 
      for (NSView *subview in view.subviews) [newSubviews addObject:subview]; 
     } 

     [currentSubviews removeAllObjects]; 
     [currentSubviews addObjectsFromArray:newSubviews]; 
     [allSubviews addObjectsFromArray:newSubviews]; 

    } 

    for (NSView *view in allSubviews) { 
     NSLog(@"View: %@, tag: %ld, identifier: %@", view, view.tag, view.identifier); 
    } 

    return allSubviews; 
} 

, जब से तुम एक NSView उपवर्ग उपयोग कर रहे हैं, या आप:

तो, NSViews, Get ALL views and subview of NSWindow की सूची प्राप्त करने के बारे में इस पोस्ट पर निर्माण करने के लिए, आप तो NSView पहचानकर्ता आप चाहते हैं के साथ मिल सकता है रनटाइम पर प्रत्येक दृश्य का "टैग" सेट कर सकता है। (या, आप रन-टाइम पर पहचानकर्ता सेट कर सकते हैं।) टैग के बारे में अच्छी बात यह है कि एक विशिष्ट टैग के साथ दृश्य खोजने के लिए एक पूर्व-निर्मित फ़ंक्शन है।

// set the tag 
NSInteger tagValue = 12345; 
[self.myButton setTag:tagValue]; 

// find it 
NSButton *myButton = [self.window.contentView viewWithTag:12345]; 
संबंधित मुद्दे