दिलचस्प पोस्ट
'कुंजी' और लैम्ब्डा अभिव्यक्ति का उपयोग करके अजगर अधिकतम फ़ंक्शन अंतराल स्क्रॉल रीसाइक्लर में आइटम को जोड़ना प्रगति के साथ नीचे तल अजगर जैसे पायथन तत्व-वार ट्यूपल परिचालन सी में टोकनिंग स्ट्रिंग मुझे क्यों "सर्वर से कनेक्ट नहीं किया जा सकता है – एक नेटवर्क से संबंधित या इंस्टेंस-विशिष्ट त्रुटि"? Xcode 7 UI परीक्षण: कोड में सिस्टम अलर्ट की श्रृंखला को खारिज करने का तरीका जावा में एक अलग थ्रेड के साथ एक विधि कॉल करने के लिए कैसे? एक अनुक्रमणिकाऑट अपरेंज एक्सपैशन / आर्गमेंटऑटऑफ़रेन्ज अपॉक्शन्स क्या है और मैं इसे कैसे ठीक कर सकता हूं? TypeError: अजगर में 'सूची' ऑब्जेक्ट को कॉल करने योग्य नहीं है क्यों enums को एक पूर्ण प्रकार का इंट प्रकार की आवश्यकता होती है? UIViewController अमान्य फ्रेम रिटर्न? हम FtpWebRequest के साथ अपलोड करने के लिए प्रगति बार कैसे दिखा सकते हैं गोल UIView CALayers का उपयोग करें – केवल कुछ कोनों – कैसे? कमांड प्रतिस्थापन: बैकटीक्स या डॉलर साइन / कोने संलग्न हैं? जावा विकल्प-एक्सएमएक्स किसके लिए खड़ा है?

इंटरफ़ेस बिल्डर के साथ बनाई गई किसी निब फ़ाइल का उपयोग करके UIView को कैसे लोड करें

मैं थोड़ा विस्तृत करने की कोशिश कर रहा हूं, लेकिन कुछ संभव होना चाहिए। तो यहाँ आपके सभी विशेषज्ञों के लिए एक चुनौती है (इस फोरम में बहुत सारे लोग हैं 🙂

मैं एक प्रश्नावली "घटक" का निर्माण कर रहा हूं, जिसे मैं NavigationContoller पर लोड करना चाहता हूं (मेरा QuestionManagerViewController )। "घटक" एक "रिक्त" UIViewController , जो उस प्रश्न के आधार पर अलग-अलग दृश्य लोड कर सकता है जिसे उत्तर देने की आवश्यकता है।

जिस तरह से मैं यह कर रहा हूं:

  1. कुछ IBOutlets परिभाषित, एक UIView उपवर्ग के रूप में Question1View ऑब्जेक्ट बनाएँ
  2. बनाएँ (इंटरफ़ेस बिल्डर का उपयोग कर रहा है) Question1View.xib (यहां है जहां मेरी समस्या शायद है ) मैं दोनों UIViewController और UIView वर्ग प्रश्न UIView लिए सेट।
  3. मैं आउटलेट्स को देखने के घटक के साथ लिंक करता हूं (आईबी के प्रयोग से)
  4. मैं इस तरह दिखने के लिए अपने QuestionManagerViewController initWithNib के initWithNib को ओवरराइड करता हूं:

     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:@"Question1View" bundle:nibBundleOrNil]) { // Custom initialization } return self; } 

जब मैं कोड चलाता हूं, तो मुझे यह त्रुटि मिलती है:

2009-05-14 15: 05: 37.152 iMobiDines [17148: 20 बी] *** बिना किसी अपवाद के ' NSInternalInconsistencyException ' को NSInternalInconsistencyException ' NSInternalInconsistencyException ', कारण: ' -[UIViewController _loadViewFromNibNamed:bundle:] "प्रश्न 1 दृश्य" -[UIViewController _loadViewFromNibNamed:bundle:] लोड किया गया लेकिन दृश्य आउटलेट सेट नहीं किया गया था। '

मुझे यकीन है कि एक viewController वर्ग बनाने की आवश्यकता के बिना, निब फाइल का उपयोग करके दृश्य को लोड करने का एक तरीका है।

वेब के समाधान से एकत्रित समाधान "इंटरफ़ेस बिल्डर के साथ बनाई गई किसी निब फ़ाइल का उपयोग करके UIView को कैसे लोड करें"

एक सरणी के रूप में निब से निपटने के बजाय दृश्य का उपयोग करने का एक आसान तरीका भी है।

1 ) किसी भी आउटलेट के साथ कस्टम व्यू उपवर्ग बनाएँ जिसे आप बाद में एक्सेस करना चाहते हैं। –मेरे विचार

2 ) UIViewController में जिसे आप लोड और एनआईबी को संभालना चाहते हैं, एक IBOutlet गुण बनाएँ जो लोड किए गए निब दृश्य को पकड़कर रखेगा, उदाहरण के लिए

MyViewController में (एक UIViewController subclass)

  @property (nonatomic, retain) IBOutlet UIView *myViewFromNib; 

(इसे संश्लेषित करने और इसे आपके .m फ़ाइल में रिलीज करने के लिए न भूलें)

3) आईबी में अपना निब खोलें (हम इसे 'myViewNib.xib' कहते हैं), फ़ाइल के स्वामी को MyViewController में सेट करें

4) अब अपने फ़ाइल के स्वामी आउटलेट myViewFromNib को निबों में मुख्य दृश्य से कनेक्ट करें।

5) अब MyViewController में, निम्न पंक्ति लिखें:

 [[NSBundle mainBundle] loadNibNamed:@"myViewNib" owner:self options:nil]; 

अब जैसे ही आप ऐसा करते हैं, अपनी संपत्ति "self.myViewFromNib" कहकर आप अपने निब से दृश्य तक पहुंच देंगे!

आप सभी को धन्यवाद। मैंने जो करना चाहता था, वह करने का एक तरीका मुझे मिला।

  1. अपनी UIView को आप की आवश्यकता के साथ IBOutlet बनाएँ
  2. आईबी में xib बनाएँ, इसे पसंद करने और इसे इस तरह लिंक करने के लिए डिज़ाइन करें: फ़ाइल के मालिक वर्ग UIViewController (कोई कस्टम उपवर्ग नहीं है, लेकिन "वास्तविक" एक)। फ़ाइल स्वामी के दृश्य मुख्य दृश्य से जुड़ा हुआ है और इसके वर्ग को चरण 1 से एक के रूप में घोषित किया गया है)।
  3. अपने नियंत्रणों को IBOutlet एस के साथ कनेक्ट करें
  4. DynamicViewController अपने लॉजिक को यह तय करने के लिए चला सकता है कि क्या / xib को लोड करना है। एक बार इसके निर्णायक बनाया गया, loadView विधि में कुछ ऐसा ही लगाया गया:

     NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"QPickOneView" owner:self options:nil]; QPickOneView* myView = [ nibViews objectAtIndex: 1]; myView.question = question; 

बस!

मुख्य बंडल के loadNibNamed विधि को देखने के लिए आरंभ करने और कनेक्शन बनाने का ध्यान रखा जाएगा।

अब ViewController स्मृति में डेटा के आधार पर एक दृश्य या अन्य प्रदर्शित कर सकता है, और "अभिभावक" स्क्रीन को इस तर्क से परेशान करने की आवश्यकता नहीं है।

मुझे यकीन नहीं है कि कुछ उत्तर किस बारे में बात कर रहे हैं, लेकिन मुझे यह जवाब यहां आने की आवश्यकता है जब मैं अगली बार Google में खोज करता हूं कीवर्ड: "कैसे एक UIView को एक निब से लोड करें" या "एक NSBundle से एक UIView लोड करने के लिए कैसे।"

यहां कोड लगभग 100% सीधे ऐप्रेस शुरुआत से आईफोन 3 बुक (पेज 247, "द न्यू टेबल व्यू सेल" का उपयोग करना) से है:

 - (void)viewDidLoad { [super viewDidLoad]; NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"Blah" owner:self options:nil]; Blah *blah; for (id object in bundle) { if ([object isKindOfClass:[Blah class]]) { blah = (Blah *)object; break; } } assert(blah != nil && "blah can't be nil"); [self.view addSubview: blah]; } 

यह मानता है कि आपके पास Blah नामक एक UIView उपवर्ग है, जो Blah नामक एक निब है जिसमें एक UIView शामिल होता है जिसमें इसकी कक्षा Blah सेट होती है।


श्रेणी: एनएसओबाइज + लोडफ्रॉमनैब

 #import "NSObject+LoadFromNib.h" @implementation NSObject (LoadFromNib) + (id)loadFromNib:(NSString *)name classToLoad:(Class)classToLoad { NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil]; for (id object in bundle) { if ([object isKindOfClass:classToLoad]) { return object; } } return nil; } @end 

स्विफ्ट एक्सटेंशन

 extension UIView { class func loadFromNib<T>(withName nibName: String) -> T? { let nib = UINib.init(nibName: nibName, bundle: nil) let nibObjects = nib.instantiate(withOwner: nil, options: nil) for object in nibObjects { if let result = object as? T { return result } } return nil } } 

और उपयोग में एक उदाहरण:

 class SomeView: UIView { class func loadFromNib() -> SomeView? { return self.loadFromNib(withName: "SomeView") } } 

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

  1. एक कस्टम MyView : UIView बनाएँ MyView : UIView और इसे वांछित XIB में रूट UIView " कस्टम क्लास " के रूप में सेट करें; कस्टम वर्ग

  2. MyView में आपको आवश्यक सभी आउटलेट बनाएं (यह अभी करें क्योंकि 3 बिंदु के बाद आईबी आपको MyView लिए आउटलेट कनेक्ट करने के लिए प्रस्ताव देगा, न कि कस्टम व्यू के रूप में हम चाहते हैं); कस्टम क्लास आउटलेट

  3. अपने UIViewController को कस्टम दृश्य XIB के " फ़ाइल के स्वामी " के रूप में सेट करें; यहां छवि विवरण दर्ज करें

  4. UIViewController आप चाहते हैं MyView प्रत्येक आवृत्ति के लिए एक नया UIViews जोड़ें, और उन्हें एक आउटलेट संग्रह बनाने के लिए UIViewController से कनेक्ट करें: ये दृश्य कस्टम दृश्य उदाहरणों के लिए "रैपर" दृश्य के रूप में कार्य करेगा; यहां छवि विवरण दर्ज करें

  5. अंत में, आपके UIViewController के viewDidLoad में निम्न पंक्तियां जोड़ें:

 NSArray *bundleObjects; MyView *currView; NSMutableArray *myViews = [NSMutableArray arrayWithCapacity:myWrapperViews.count]; for (UIView *currWrapperView in myWrapperViews) { bundleObjects = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; for (id object in bundleObjects) { if ([object isKindOfClass:[MyView class]]){ currView = (MyView *)object; break; } } [currView.myLabel setText:@"myText"]; [currView.myButton setTitle:@"myTitle" forState:UIControlStateNormal]; //... [currWrapperView addSubview:currView]; [myViews addObject:currView]; } //self.myViews = myViews; if need to access them later.. 

मैं एक कस्टम UIView को पुनः प्रयोग करने के लिए यूआईनिब का इस्तेमाल करेगा

 UINib *customNib = [UINib nibWithNibName:@"MyCustomView" bundle:nil]; MyCustomViewClass *customView = [[customNib instantiateWithOwner:self options:nil] objectAtIndex:0]; [self.view addSubview:customView]; 

इस मामले में आवश्यक फ़ाइलें हैं MyCustomView.xib , MyCustomViewClass.h और MyCustomViewClass.m ध्यान दें कि [UINib instantiateWithOwner] एक सरणी देता है, इसलिए आपको उस तत्व का उपयोग करना चाहिए जो कि UIView को पुनः उपयोग करने के लिए आप चाहते हैं। इस मामले में यह पहला तत्व है

आपको इंटरफेस बिल्डर में UIView उप-वर्ग होने के लिए अपने दृश्य नियंत्रक का वर्ग सेट नहीं करना चाहिए। यह निश्चित रूप से कम से कम आपकी समस्या का हिस्सा है। यह छोड़ें कि या तो UIViewController , इसके कुछ उप-वर्ग, या आपके पास कोई अन्य कस्टम वर्ग है

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

यदि आप अपने दृश्य के लिए एक UIViewController अपने फ़ाइल के मालिक के रूप में उपयोग करते हैं, तो आप केवल initWithNibName:bundle: उपयोग कर सकते हैं initWithNibName:bundle: इसे लोड करने के लिए और दृश्य नियंत्रक ऑब्जेक्ट को वापस प्राप्त करें। आईबी में, सुनिश्चित करें कि आप view आउटलेट को एक्सआईबी में अपने इंटरफेस के साथ view सेट करते view । यदि आप किसी अन्य प्रकार के ऑब्जेक्ट का उपयोग अपने फाइल के स्वामी के रूप में करते हैं, तो आपको loadNibNamed:owner:options: विधि को लोड करने के लिए विधि का उपयोग करना होगा, फ़ाइल के स्वामी को विधि में loadNibNamed:owner:options: करना। सभी संपत्तियां आपको आईबी में परिभाषित आउटलेट्स के अनुसार ठीक से सेट की जाएंगी।

आप LoadNibNamed के बजाय UIViewController के initWithNibName का उपयोग कर सकते हैं यह आसान है, मुझे लगता है

 UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"MySubView" bundle:nil]; [self.subview addSubview:aViewController.view]; [aViewController release]; // release the VC 

अब आपको सिर्फ MySubView.xib और MySubView.h / एम बनाने होंगे MySubView.xib में फ़ाइल के स्वामी वर्ग को UIViewController पर सेट करें और MySubView को क्लास देखें।

पैरेंट xib फ़ाइल का उपयोग करके आप subview की स्थिति और आकार कर सकते हैं।

यह एक बढ़िया सवाल है (1) और जवाब लगभग सहायक थे;) क्षमा करें, लेकिन मेरे पास इस के माध्यम से फिसलने का एक समय था, हालांकि गोंसा और एवरी डेव दोनों ने अच्छा संकेत दिया था। उम्मीद है, यह जवाब दूसरों की मदद करेगा

MyVC यह दृश्य नियंत्रक है जो यह सब सामान रखता है

MySubview ऐसा विचार है कि हम एक xib से लोड करना चाहते हैं

  • MyVC.xib में, प्रकार का एक दृश्य बनाएं MySubView जो सही आकार और आकार और वह स्थान है जहां आप चाहते हैं।
  • MyVC एच में, है

     IBOutlet MySubview *mySubView // ... @property (nonatomic, retain) MySubview *mySubview; 
  • MyVC.m में, @synthesize mySubView; और इसे dealloc में रिलीज करने के लिए मत भूलना

  • MySubview.h में, UIView *view लिए एक आउटलेट / प्रॉपर्टी है (अनावश्यक हो सकती है, लेकिन मेरे लिए काम की गई है।) इसे संश्लेषित करें और इसे जारी करें।
  • MySubview.xib में
    • फ़ाइल स्वामी प्रकार को MySubview सेट करें, और दृश्य को अपने दृश्य में लिंक करें
    • सभी बिट्स को बाहर IBOutlet और वांछित IBOutlet से जुड़ें
  • MyVC.m में वापस, है

     NSArray *xibviews = [[NSBundle mainBundle] loadNibNamed: @"MySubview" owner: mySubview options: NULL]; MySubview *msView = [xibviews objectAtIndex: 0]; msView.frame = mySubview.frame; UIView *oldView = mySubview; // Too simple: [self.view insertSubview: msView aboveSubview: mySubview]; [[mySubview superview] insertSubview: msView aboveSubview: mySubview]; // allows nesting self.mySubview = msView; [oldCBView removeFromSuperview]; 

मेरे लिए मुश्किल सा हो गया था: अन्य उत्तरों में संकेतों को xib से मेरे विचार को लोड किया गया, लेकिन मेरीवीसी (डुह!) में दृश्य को प्रतिस्थापित नहीं किया गया – मुझे उस स्वयं को स्वयं को स्वैप करना पड़ा

इसके अलावा, mySubview के तरीकों तक पहुंच प्राप्त करने के लिए, .xib फ़ाइल में view प्रॉपर्टी को MySubview सेट होना चाहिए MySubview अन्यथा, यह एक सादा-पुराने UIView रूप में वापस आता है।

अगर mySubview सीधे अपने खुद के mySubview से लोड करने का एक तरीका है, जो रॉक था, लेकिन मुझे यह कहां mySubview चाहिए जहां मुझे होना चाहिए।

यह ऐसा कुछ है जिसे आसान होना चाहिए। मैं समाप्त हो गया UIViewController विस्तार और एक loadNib:inPlaceholder: जोड़ने loadNib:inPlaceholder: चयनकर्ता अब मैं कह सकता हूँ

 self.mySubview = (MyView *)[self loadNib:@"MyView" inPlaceholder:mySubview]; 

यहां श्रेणी के लिए कोड है (यह वही रिगमारोल होता है जो गोंसो द्वारा वर्णित है):

 @interface UIViewController (nibSubviews) - (UIView *)viewFromNib:(NSString *)nibName; - (UIView *)loadNib:(NSString *)nibName inPlaceholder:(UIView *)placeholder; @end @implementation UIViewController (nibSubviews) - (UIView *)viewFromNib:(NSString *)nibName { NSArray *xib = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]; for (id view in xib) { // have to iterate; index varies if ([view isKindOfClass:[UIView class]]) return view; } return nil; } - (UIView *)loadNib:(NSString *)nibName inPlaceholder:(UIView *)placeholder { UIView *nibView = [self viewFromNib:nibName]; [nibView setFrame:placeholder.frame]; [self.view insertSubview:nibView aboveSubview:placeholder]; [placeholder removeFromSuperview]; return nibView; } @end 

मैं भी कुछ करना चाहता था, यह वही है जो मैंने पाया: (एसडीके 3.1.3)

मेरे पास एक दृश्य नियंत्रक ए है (जो एक नव नियंत्रक के स्वामित्व में है) जो एक बटन प्रेस पर वीसी बी लोड करता है:

AViewController.m में

 BViewController *bController = [[BViewController alloc] initWithNibName:@"Bnib" bundle:nil]; [self.navigationController pushViewController:bController animated:YES]; [bController release]; 

अब वीसी बी का इंटरफेस बीएनआईबी से है, लेकिन जब एक बटन दबाया जाता है, तो मैं एक 'एडिट मोड' पर जाना चाहता हूं, जिसमें अलग निब से एक अलग यूआई है, लेकिन मुझे संपादन मोड के लिए नया वीसी नहीं चाहिए, मैं चाहता हूं कि मेरे मौजूदा बी उपाध्यक्ष के साथ नए निबंधात्मक सम्मिलित हों।

इसलिए, BViewController.m में (बटन प्रेस विधि में)

 NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"EditMode" owner:self options:nil]; UIView *theEditView = [nibObjects objectAtIndex:0]; self.editView = theEditView; [self.view addSubview:theEditView]; 

फिर एक अन्य बटन दबाएं (संपादन मोड से बाहर निकलने के लिए):

 [editView removeFromSuperview]; 

और मैं वापस अपने मूल Bnib पर हूँ

यह ठीक काम करता है, लेकिन ध्यान दें कि मेरे EditMode.nib में केवल 1 शीर्ष स्तर obj है, एक UIView obj इससे कोई फर्क नहीं पड़ता कि इस निबेज में फ़ाइल के मालिक को बीवीआईयूआईटी नियंत्रक या डिफ़ॉल्ट एनएसओबैज के रूप में सेट किया गया है, लेकिन यह सुनिश्चित कर लें कि फाइल के स्वामी में व्यू आउटलेट कुछ भी नहीं सेट है। यदि ऐसा है, तो मुझे एक exc_bad_access क्रैश और xcode आय प्राप्त होता है जो 6677 स्टैक फ़्रेमों को लोड करता है जो आंतरिक UIView विधि को बार-बार कहा जाता है … इसलिए एक अनंत लूप की तरह लग रहा है। (व्यू आउटलेट मेरे मूल बीएनआईबी में सेट है)

उम्मीद है की यह मदद करेगा।

मैंने एक श्रेणी बनाई जो मुझे पसंद है:

UIView+NibInitializer.h

 #import <UIKit/UIKit.h> @interface UIView (NibInitializer) - (instancetype)initWithNibNamed:(NSString *)nibNameOrNil; @end 

UIView+NibInitializer.m

 #import "UIView+NibInitializer.h" @implementation UIView (NibInitializer) - (instancetype)initWithNibNamed:(NSString *)nibNameOrNil { if (!nibNameOrNil) { nibNameOrNil = NSStringFromClass([self class]); } NSArray *viewsInNib = [[NSBundle mainBundle] loadNibNamed:nibNameOrNil owner:self options:nil]; for (id view in viewsInNib) { if ([view isKindOfClass:[self class]]) { self = view; break; } } return self; } @end 

फिर, इस तरह कॉल करें:

 MyCustomView *myCustomView = [[MyCustomView alloc] initWithNibNamed:nil]; 

अपने निब नाम का उपयोग करें अगर आपके निब का नाम आपके वर्ग के नाम के अलावा कुछ और है

इसे अपने उपवर्गों में अतिरिक्त व्यवहार के लिए ओवरराइड करने के लिए, यह इस तरह दिख सकता है:

 - (instancetype)initWithNibNamed:(NSString *)nibNameOrNil { self = [super initWithNibNamed:nibNameOrNil]; if (self) { self.layer.cornerRadius = CGRectGetHeight(self.bounds) / 2.0; } return self; } 

तेज में

दरअसल, इस समस्या का मेरा संकल्प, मेरे कस्टन वीआईयूआई कंट्रोलर में एक व्यू डीडलोड में दृश्य लोड करने के लिए था, जहां मैं उस दृश्य को इस तरह इस्तेमाल करना चाहता था:

 myAccessoryView = NSBundle.mainBundle().loadNibNamed("MyAccessoryView", owner: self, options: nil)[0] as! MyAccessoryView 

लोड लोड loadView() विधि में दृश्य लोड न करें! लोडव्यू विधि आपके कस्टम व्यू नियंत्रक के लिए दृश्य लोड करने के लिए कार्य करता है।

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

स्वीकार्य विकल्प के साथ स्विफ्ट उपयोगकर्ता के लिए:

  1. एक कस्टम UIView उपवर्ग और एक xib फाइलें बनाएँ , जो कि हम अपने स्वयं के वर्ग के नाम के नाम पर करेंगे: हमारे मामले में MemeView। मेमे व्यू क्लास के अंदर इसे क्लास घोषित करने से पहले @IBDesignable एट्रिब्यूट के साथ @IBDesignable रूप में परिभाषित करना याद रखें
  2. हमारे कस्टम UIView subclass के साथ indetity इंस्पेक्टर पैनल के साथ xib में फ़ाइल के मालिक को सेट करने के लिए Rember

    यहां छवि विवरण दर्ज करें

  3. अब एक्सआईफ़ फाइल में हम अपने इंटरफेस का निर्माण कर सकते हैं, बाधाएं बना सकते हैं, आउटलेट्स, एक्शन आदि बना सकते हैं। यहां छवि विवरण दर्ज करें

  4. हमें अपने कस्टम वर्ग में कुछ तरीकों को लागू करने की आवश्यकता है ताकि एक बार initialized में xib खोलें

    class XibbedView: UIView {

     weak var nibView: UIView! override convenience init(frame: CGRect) { let nibName = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last! self.init(nibName: nibName) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) let nibName = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last! let nib = loadNib(nibName) nib.frame = bounds nib.translatesAutoresizingMaskIntoConstraints = false addSubview(nib) nibView = nib setUpConstraints() } init(nibName: String) { super.init(frame: CGRectZero) let nibName = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last! let nib = loadNib(nibName) nib.frame = bounds nib.translatesAutoresizingMaskIntoConstraints = false addSubview(nib) nibView = nib setUpConstraints() } func setUpConstraints() { ["V","H"].forEach { (quote) -> () in let format = String(format:"\(quote):|[nibView]|") addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: [], metrics: nil, views: ["nibView" : nibView])) } } func loadNib(name: String) -> UIView { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: name, bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView return view } 

    }

  5. हमारे कस्टम वर्ग में हम कुछ अन्वेषणीय गुणों को परिभाषित भी कर सकते हैं ताकि उन्हें इंटरफ़ेस बिल्डर से पूर्ण नियंत्रण प्राप्त हो

    @IBDesignable class MemeView: XibbedView {

     @IBInspectable var memeImage: UIImage = UIImage() { didSet { imageView.image = memeImage } } @IBInspectable var textColor: UIColor = UIColor.whiteColor() { didSet { label.textColor = textColor } } @IBInspectable var text: String = "" { didSet { label.text = text } } @IBInspectable var roundedCorners: Bool = false { didSet { if roundedCorners { layer.cornerRadius = 20.0 clipsToBounds = true } else { layer.cornerRadius = 0.0 clipsToBounds = false } } } @IBOutlet weak var label: UILabel! @IBOutlet weak var imageView: UIImageView! 

}

कुछ उदाहरण:
यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

यदि हमें स्टोरीबोर्ड या किसी अन्य xib के अंदर प्रदर्शित होने के दौरान अधिक जानकारी जोड़ने की आवश्यकता है, तो हम इसे तैयार करने के लिए prepareForInterfaceBuilder() कर सकते prepareForInterfaceBuilder() , इस पद्धति को केवल इंटरफ़ेस बिल्डर में फ़ाइल खोलते समय ही निष्पादित किया जाएगा। यदि आपने जो कुछ लिखा है, लेकिन कुछ भी नहीं कर रहा है, यह कार्यान्वयन में ब्रेकपॉइंट जोड़कर एक सिगल दृश्य को डिबग करने का एक तरीका है। यहां छवि विवरण दर्ज करें
यहां पर विचार पदानुक्रम है Hiearchy देखें

उम्मीद है कि यह एक पूर्ण नमूना डाउनलोड किया जा सकता है यहाँ डाउनलोड किया जा सकता है

पिछले जवाब में आईफोन एसडीके की 2.0 और 2.1 के बीच होने वाली एनआईबी (एक्सआईबी) संरचना में कोई बदलाव नहीं आया है। उपयोगकर्ता सामग्री अब 1 के बजाय सूचकांक 0 से शुरू होती है।

आप 2.1 मैक्रो का उपयोग कर सकते हैं जो कि सभी संस्करण 2.1 और उसके बाद के संस्करण के लिए मान्य है (जो कि IPHONE से पहले दो अंडरस्कोर है:

  // Cited from previous example NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"QPickOneView" owner:self options:nil]; int startIndex; #ifdef __IPHONE_2_1 startIndex = 0; #else startIndex = 1; #endif QPickOneView* myView = [ nibViews objectAtIndex: startIndex]; myView.question = question; 

हम अपने अधिकांश अनुप्रयोगों के लिए इस तरह के एक तकनीक का उपयोग करते हैं।

बार्नी

मुझे एक ही चीज़ (एक XIB फ़ाइल से प्रोग्राम को एक लोड लोड करना) करने का कारण था, लेकिन मुझे यह पूरी तरह से एक UIView (किसी भी तरह से दृश्य नियंत्रक को शामिल किए बिना) के उप-वर्ग के उप-वर्ग के संदर्भ से करने की आवश्यकता थी। ऐसा करने के लिए मैंने इस उपयोगिता विधि को बनाया है:

 + (id) initWithNibName:(NSString *)nibName withSelf:(id)myself { NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:nibName owner:myself options:nil]; for (id object in bundle) { if ([object isKindOfClass:[myself class]]) { return object; } } return nil; } 

तब मैं इसे अपने उपवर्ग ' initWithFrame विधि से इसे पसंद करता हूं:

 - (id)initWithFrame:(CGRect)frame { self = [Utilities initWithNibName:@"XIB1" withSelf:self]; if (self) { // Initialization code. } return self; } 

सामान्य रुचि के लिए पोस्ट किया; अगर कोई इस तरह से बिना किसी समस्या को देखता है, तो कृपया मुझे बताएं

स्विफ्ट में इसे करने का एक तरीका है (वर्तमान में स्विफ्ट 2.0 को XCode 7 बीटा 5 में लिखा है)।

आपके UIView subclass से जिसे आप इंटरफ़ेस बिल्डर में "कस्टम क्लास" के रूप में सेट करते हैं, इस तरह एक विधि बनायें (मेरे उपवर्ग को रिकॉर्डिंगफ़ूटरव्यू कहा जाता है):

 class func loadFromNib() -> RecordingFooterView? { let nib = UINib(nibName: "RecordingFooterView", bundle: nil) let nibObjects = nib.instantiateWithOwner(nil, options: nil) if nibObjects.count > 0 { let topObject = nibObjects[0] return topObject as? RecordingFooterView } return nil } 

तो आप इसे इस तरह बस कॉल कर सकते हैं:

let recordingFooterView = RecordingFooterView.loadFromNib()

जवाब में से कोई भी नहीं बताता है कि अकेले खड़े कैसे बनायें XIB जो इस प्रश्न की जड़ है। "नई XIB फ़ाइल बनाएँ" के लिए कोई Xcode 4 विकल्प नहीं है

यह करने के लिए

 1) Choose "New File..." 2) Choose the "User Interface" category under the iOS section 3) Choose the "View" item 4) You will then be prompted to choose an iPhone or iPad format 

यह सरल लग सकता है लेकिन "XIB" शब्द कहीं भी दिखाई नहीं देता है, लेकिन इसके लिए आप कुछ मिनटों को इसके लिए पोकिंग कर सकते हैं।

@AVeryDev

6) अपने दृश्य नियंत्रक के दृश्य में लोड किए गए दृश्य को संलग्न करने के लिए:

 [self.view addSubview:myViewFromNib]; 

संभवतया, मेमोरी लीक से बचने के लिए इसे देखने से निकालना आवश्यक है।

स्पष्ट करने के लिए: दृश्य नियंत्रक के पास कई IBOutlets हैं, जिनमें से कुछ मूल निब फ़ाइल (सामान्य रूप से) में आइटम से जुड़े हैं, और कुछ लोड किए गए निब में आइटम से जुड़े हैं। दोनों निबों का मालिक मालिक है। भारित दृश्य मूल एक overlays

संकेत: लोड किए गए निब को शून्य में मुख्य दृश्य की अस्पष्टता सेट करें, फिर यह मूल निब से वस्तुओं को अस्पष्ट नहीं करेगा

कई घंटे बिताने के बाद, मैंने निम्नलिखित समाधान बना दिया कस्टम UIView बनाने के लिए इन चरणों का पालन करें।

1) IIView से विरासत में मिली myCustomView क्लास बनाएं
यहां छवि विवरण दर्ज करें

2) नाम बनाएँ myCustomView के साथ।
यहां छवि विवरण दर्ज करें

3) अपने .xib फ़ाइल के अंदर UIView की कक्षा बदलें, वहाँ अपने कस्टम वर्चुअल क्लास को असाइन करें।
यहां छवि विवरण दर्ज करें

4) IBOutlets बनाएँ
यहां छवि विवरण दर्ज करें

5) लोड करें। Xib में myCustomView * customView निम्नलिखित नमूना कोड का उपयोग करें

 myCustomView * myView = [[[NSBundle mainBundle] loadNibNamed:@"myCustomView" owner:self options:nil] objectAtIndex:0]; [myView.description setText:@"description"]; 

नोट: जो लोग अभी भी समस्या का सामना कर रहे हैं, वे टिप्पणी कर सकते हैं, मैं उनके साथ अपने प्रोजेक्ट का नमूना प्रोजेक्ट प्रदान करेगा

मेरे पास विचारों के रूप में वही विचारों के साथ xibs नामकरण का एक सम्मेलन है। एक के रूप में एक एक दृश्य नियंत्रक के लिए करना होगा फिर, मुझे कोड नामों में कक्षा के नामों को लिखना नहीं है I मैं एक ही नाम के साथ एक निब फ़ाइल से एक UIView लोड।

MyView नामक कक्षा के लिए उदाहरण

  • MyView.xib इन इंटरफ़ेस बिल्डर नामक निब फ़ाइल बनाएं
  • इंटरफ़ेस बिल्डर में, एक UIView जोड़ें अपनी कक्षा को MyView में सेट करें अपने दिल की सामग्री को कस्टमाइज़ करें, MyView के उदाहरण चर को बाद में एक्सेस करने के लिए उप-दृश्य के लिए तैयार करें
  • अपने कोड में, इस तरह एक नया MyView बनाएं:

    MyView * myView = [MyView nib_viewFromNibWithOwner: स्वामी];

इसके लिए यहां श्रेणी है:

 @implementation UIView (nib) + (id) nib_viewFromNib { return [self nib_viewFromNibWithOwner:nil]; } + (id) nib_viewFromNibWithOwner:(id)owner { NSString *className = NSStringFromClass([self class]); NSArray *nib = [[NSBundle mainBundle] loadNibNamed:className owner:owner options:nil]; UIView *view = nil; for(UIView *v in nib) { if ([v isKindOfClass:[self class]]) { view = v; break; } } assert(view != nil && "View for class not found in nib file"); [view nib_viewDidLoad]; return view; } // override this to do custom setup -(void)nib_viewDidLoad { } 

तब मैं नियंत्रक से क्रियाओं के साथ बटनों को तारूंगा, और मेरे कस्टम दृश्य उप-वर्ग में आउटलेट का उपयोग करते हुए लेबलों पर चीजों को सेट कर दूंगा

सबसे छोटा संस्करण:

 RSFavoritePlaceholderView *favoritePlaceholderView = [[[NSBundle mainBundle] loadNibNamed:@"RSFavoritePlaceholderView" owner:self options:nil] firstObject]; 

मैं इसके लिए UIView में एक श्रेणी को जोड़ना समाप्त कर दिया:

  #import "UIViewNibLoading.h" @implementation UIView (UIViewNibLoading) + (id) loadNibNamed:(NSString *) nibName { return [UIView loadNibNamed:nibName fromBundle:[NSBundle mainBundle] retainingObjectWithTag:1]; } + (id) loadNibNamed:(NSString *) nibName fromBundle:(NSBundle *) bundle retainingObjectWithTag:(NSUInteger) tag { NSArray * nib = [bundle loadNibNamed:nibName owner:nil options:nil]; if(!nib) return nil; UIView * target = nil; for(UIView * view in nib) { if(view.tag == tag) { target = [view retain]; break; } } if(target && [target respondsToSelector:@selector(viewDidLoad)]) { [target performSelector:@selector(viewDidLoad)]; } return [target autorelease]; } @end 

स्पष्टीकरण यहां है: आईओएस और मैक में व्यू नियंत्रक कम दृश्य लोड हो रहा है