2015-10-25 5 views
11

मैं मुख्य विंडो के लिए एक xib है में कहा जाता है प्रस्तुत नहीं होती, और मैं निम्न चरणों में एक कस्टम दृश्य बनाया:कस्टम इंटरफ़ेस निर्माता द्वारा बनाए गए दृश्य जब अन्य विचारों

  1. एक नया वर्ग है जहाँ से विरासत में बनाएं NSView

MyView.h:

#import <Cocoa/Cocoa.h> 
    IB_DESIGNABLE 
    @interface MyView : NSTableCellView 
    @end 

MyView.m:

#import "MyView.h" 

    @implementation MyView 

    - (void)awakeFromNib { 
     NSLog(@"Post view awaking from nib."); 
    } 

    @end 
  1. एक नया xib बनाएँ, और ऊपर बनाया वर्ग के लिए रूट दृश्य की कक्षा निर्धारित किया है। और उस xib में डिजाइन।
  2. xib से कक्षा में आउटलेट सेट करें।

और मैं निम्न चरणों में इस कस्टम दृश्य का उपयोग करने के मुख्य विंडो में करने की कोशिश की:

  1. खींचें मुख्य विंडो के xib के लिए एक कस्टम दृश्य।
  2. ऊपर दिए गए वर्ग में उस कस्टम दृश्य की कक्षा सेट करें।

लेकिन कुछ भी प्रस्तुत नहीं करता है। लॉग से, मैं देख सकता हूं कि कस्टम व्यू क्लास से awakeFromNib में कोड निष्पादित किया गया है। जब मैं कक्षा को IB_DESIGNABLE पर सेट करता हूं, तो दृश्य मुख्य विंडो के xib में खाली हो जाता है, जो मैंने डिज़ाइन किया है उससे भिन्न है।

मैंने कस्टम क्लास के xib को कस्टम क्लास में फ़ाइल स्वामी सेट करने का प्रयास किया, लेकिन कुछ भी नहीं बदला।

मुझे लगता है कि समस्या यह है कि कस्टम दृश्य की xib फ़ाइल वास्तव में लोड नहीं होती है। जब मैंने इसे गुगल किया, तो इस सटीक विषय पर कुछ संदर्भ होने लगते हैं। तो, मुझे वास्तव में इस लक्ष्य को कैसे प्राप्त करना चाहिए? यानी, आईबी में एक दृश्य तैयार करें, कक्षा में अपनी विधियों को लागू करें, इन दोनों को जोड़ दें, और अन्य xibs में उपयोग के लिए सिस्टम दृश्य की तरह इसे बेनकाब करें?

अद्यतन:

मैं एक ट्यूटोरियल एहसास होता है और क्या मैं (जब बनाया सही ढंग से दृश्य प्रतिपादन के लिए) की कमी है। मैं दृश्य वर्ग के लिए दृश्य से एक आउटलेट को जोड़ने के लिए xib में है:

@property (nonatomic, strong) IBOutlet NSView *view; 

, और फिर (id)initWithCoder:(NSCoder *)coder विधि में लोड।

[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self topLevelObjects:nil]; 
[self addSubview:self.view]; 

लेकिन दृश्य अभी भी इंटरफ़ेस निर्माता में प्रस्तुत नहीं करेगा।

+0

बस एक छोटी सी टिप्पणी: आपके आईबीऑलेट्स (विशेष परिस्थितियों में) हमेशा कमजोर होना चाहिए। संदर्भ निब लोडर के स्वामित्व का कारण है। – Kelsey

+0

इसके अलावा, आप "एनएसवी व्यू से विरासत में प्राप्त एक नई कक्षा" नहीं बना रहे हैं, वास्तव में, यह वास्तव में एनएसटीबलसेलव्यू से विरासत में है। एनएसटीबलसेलव्यू क्या कर रहा है, यह नहीं बता रहा है, तो हो सकता है कि आप अभी एनएसवी व्यू के लिए अपना कोड सरल बना सकें? – Kelsey

+0

आईओएस लोड में देखने के लिए एक और चीज, NNNNamed: वास्तव में दृश्यों की एक सरणी देता है, वास्तविक दृश्य नहीं। तो वापसी की जांच करें। एनएसएआरएआरई * विचार = [[एनएसबंडल मेनबंडल] loadNibNamed: @ "MyView" स्वामी: self topLevelObjects: nil]; MyView * myView = विचार [0]; – Kelsey

उत्तर

3

आपका अनुमान सही है: xib लोड नहीं किया जा रहा है। निब लोडर को आपके कस्टम व्यू के निब के बारे में पता नहीं है। निब फ्रेमवर्क उस कनेक्शन को परिभाषित करने के लिए सुविधा प्रदान नहीं करता है, इसलिए आपको xib लोड करने के लिए कोड लिखना होगा।

यहां मैं क्या करूँगा। अपने कस्टम दृश्य करने के लिए एक contentView संपत्ति जोड़ें: अपने कस्टम दृश्य का निब में

@interface MyView() 

@property (nonatomic, strong, readwrite) IBOutlet NSView *contentView; 

@end 

, वापस NSView के लिए रूट देखने का रिवाज वर्ग सेट और सभी (न अब मान्य) आउटलेट से कनेक्शन डिस्कनेक्ट कर दें। फ़ाइल के मालिक की कस्टम क्लास को अपने कस्टम क्लास नाम पर सेट करें (उदा। MyView)। रूट व्यू को फ़ाइल के मालिक के contentView आउटलेट से कनेक्ट करें, और अन्य सभी आउटलेट को फाइल के मालिक से निब में उपयुक्त ऑब्जेक्ट्स से कनेक्ट करें।

फिर निब लोड और एक subview के रूप में सामग्री दृश्य जोड़ने के लिए अपने कस्टम दृश्य उपवर्ग में awakeFromNib लागू:

@implementation MyView { 
    BOOL hasLoadedOwnNib: 1; 
} 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    [self loadOwnNibIfNeeded]; 
} 

- (void)loadOwnNibIfNeeded { 
    if (hasLoadedOwnNib) { 
     return; 
    } 

    hasLoadedOwnNib = YES; 

    [[NSBundle bundleForClass:self.class] loadNibNamed:NSStringFromClass(self.class) owner:self topLevelObjects:nil]; 
    self.contentView.frame = self.bounds; 
    self.contentView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; 
    [self addSubview:self.contentView]; 
} 

@end 

नोट आप अनंत प्रत्यावर्तन की अनुमति नहीं सावधान रहना होगा कि। जब आपका ऐप मुख्य विंडो की नीब लोड करता है, तो यह MyView का उदाहरण देगा और (अंत में) इसे awakeFromNib भेजें। फिर, awakeFromNib में, MyView अपनी खुद की नीब लोड करता है, जहां यह फ़ाइल का स्वामी है। निब लोडर फ़ाइल के मालिक को awakeFromNib भेजता है, और यह तब होगा जब आप पहले से ही -[MyView awakeFromNib] में हों। यदि आप इसकी जांच नहीं करते हैं, तो असंबद्ध रिकर्सन के कारण आपको स्टैक ओवरफ़्लो मिलता है।

2

आप किसी भी कोड प्रदान नहीं कर रहे हैं, लेकिन यहां कुछ विवेक की जाँच करता हैं:

  • आप सही तरीके से निब नाम निर्दिष्ट कर रहे हैं? आईओएस में इसकी कैप्स संवेदनशील होती है, लेकिन मुझे नहीं लगता कि यह आपके लिए है।

  • पैकेज की जांच करें, वास्तव में वहां निब है? सुनिश्चित करें कि यह आपके द्वारा बनाए गए लक्ष्य का हिस्सा है।

  • एक फ्रेम समस्या भी हो सकती है। सुनिश्चित करें कि आपके ऑटो-आकार बदलने वाले पैरामीटर सही तरीके से सेट हैं और यह सब कुछ फ्रेम में है।

  • एक और चेक जो आप कर सकते हैं वह है कि आप अपनी आईबीओटलेट्स को उस यूआईवीव (या अन्य) के वास्तविक फ्रेम में सेट करें, जिसमें आप रुचि रखते हैं। फिर जागृत करें, आप सुनिश्चित कर सकते हैं कि उनका फ्रेम मौजूद है, या वे बिल्कुल मौजूद हैं।

+0

कृपया मेरा अपडेट देखें। – Colliot

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