2011-02-23 8 views
16

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

मैं उस xib ऑब्जेक्ट (बटन) को किसी अन्य xib में उपयोग करना चाहता हूं, जहां मेरे पास उस बटन की 6 ऑब्जेक्ट्स हैं।

मुझे पता है कि मैं क्लास आइडेंटिफ़ायर का उपयोग करके प्रोग्रामेटिक रूप से ऐसा कर सकता हूं, लेकिन फिर मुझे अपने लेबल्स और छवि दृश्य को स्थानांतरित करना होगा, और कोड में डिफ़ॉल्ट मान और बाकी सब कुछ सेट करना होगा।

मुझे आश्चर्य है कि आईबी का उपयोग करके एक ही चीज़ करना संभव है?

तो (निश्चित रूप से मैं अभी भी कोड में मान निर्धारित होता है, लेकिन मैं lables/imageView और सभी बाकी के पदों xib में सेट करने के लिए चाहते हैं)

धन्यवाद

संपादित , मैं समझता हूं कि मैंने पहले जो पूछा था वह संभव नहीं है। अब मैं जो कोशिश कर रहा हूं वह इस तरह है:

मैंने ButtonTest.xib बनाया। Xib के अंदर मेरे पास UIView और 3 सबव्यूज़ (2 लेबल्स और एक बटन) है। इंस्पेक्टर में मैंने UIView क्लास को ButtonTest पर सेट किया है। बटनटेस्ट.एम के अंदर मेरे पास प्रत्येक सबव्यू के लिए 3 आउटलेट हैं, जिन्हें मैं आईबी में जोड़ता हूं।

अगला मेरे पास ButtonTestViewController.xib है। इसके अंदर मैंने एक दृश्य रखा और इंस्पेक्टर में इसकी कक्षा ButtonTest होने के लिए सेट की। मैं ButtonTestViewController.m अंदर वर्ग ButtonTest

की अब एक myTextView आउटलेट से उस दृश्य कनेक्ट करते हैं, इस ButtonTestViewController.m viewDidLoad अंदर कोड है:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"ButtonTest" owner:nil options:nil]; 
    ButtonTest *mainView = (ButtonTest*)[subviewArray objectAtIndex:0]; 

    self.myTextView = mainView; 
} 

मैं क्या आशा व्यक्त की क्या होगा, यह है कि ButtonTestViewController में देखने के लिए। xib उस दृश्य को बन जाएगा जिसे मैंने ButtonTest.xib में डिज़ाइन किया था। यह अभी नहीं हो रहा है। क्या होता है कि बटनटेस्ट व्यू कंट्रोलर.एक्सिब के अंदर का दृश्य वही रहता है।

[self.view addSubview:mainView]; 

यह नया दृश्य जोड़ते करता मौजूदा एक के अलावा,:

उल्लेख के लायक, कि अगर मैं जोड़ है।

कोई विचार है कि मैं क्या करना चाहता हूं?

आखिरकार मैं ButtonTestViewController.xib में 6 विचारों को देखना चाहता हूं, सभी ButtonTest.xib टेम्पलेट की तरह दिखेगा, और लेबल्स मान कोड में सेट किए जाएंगे।

EDIT2

ठीक है, लोग मैं सब कुछ किया था तुमने कहा था और यह एक आकर्षण की तरह काम किया। इस समस्या के साथ अभी मेरे पास एकमात्र समस्या है जब ButtonTestViewController.xib में दृश्य थोड़ा बड़ा है तो ButtonTest.xib में देखें। जब ऐसा होता है, बटन पर लचीला बेहद धुंधला दिखता है। जब वे दोनों एक ही आकार के होते हैं, तो यह सब अच्छा है।-

@ नेड मैं सटीक कोड तुम मेरे InitWithCoder विधि में तैनात छोड़कर मैं इस के लिए फ्रेम की सजा बंद कर इस्तेमाल किया,:

self.bounds = mainView.frame; 

मैं इसे ठीक करने की कोशिश आईबी में सामग्री मोड के साथ खेल की कोशिश की है, असफलता से।

जब मैं की तरह आप पोस्ट, जिसका अर्थ यह प्रयोग करते हैं:

mainView.frame = self.bounds; 

यह बिल्कुल भी काम नहीं कर रहा है, और दोनों बार देखा गया 'आकार एक ही रहते हैं। यहां मैंने आकार बदलने के साथ खेलने की कोशिश की लेकिन अभी भी काम नहीं किया।

और विचार करें कि इन 2 मुद्दों को कैसे ठीक किया जाए? धन्यवाद दोस्तों!

संपादित 3

मैं मुद्दों में से एक ठीक करने के लिए, ButtonTestViewController.xib को ButtonTest.xib दृश्य आकार आकार बदलने का प्रबंधन कैसे किया। यह वही मैंने किया

self.bounds = CGRectMake(0, 0, mainView.frame.size.width, mainView.frame.size.height); 
     CGRect overlay2Frame = self.frame; 
     overlay2Frame.origin.x = round(overlay2Frame.origin.x); 
     overlay2Frame.origin.y = round(overlay2Frame.origin.y); 
     self.frame = overlay2Frame; 

अन्य मुद्दा मैं अभी भी हल नहीं कर सकता (अस्पष्ट मुद्दा, here से लिया हल करने के लिए कोड का उपयोग) है। ButtonTest.xib में दृश्य अन्य दृश्य से मेल खाने के लिए बड़ा नहीं होगा।

उत्तर

15

आप इसे और आसानी से कर सकते हैं। जिस तरह से मैं ऐसा करता हूं वह एक UIView सबक्लास बना देता है (मान लें कि इसे "MyView.m" और "MyView.h" कहा जाता है), और फिर "MyView.xib" नामक एक निब।

सबसे पहले, निब में, फ़ाइल के स्वामी पर क्लिक करें, और कक्षा को "MyView" पर सेट करें। इससे आईबी में आपकी कक्षा से आईबीओटलेट/क्रियाएं दिखाई देगी। अपने मुख्य दृश्य के रूप में एक शीर्ष-स्तरीय दृश्य जोड़ें (यदि इसमें पहले से कोई नहीं है), और मुख्य UIView के सबव्यू के रूप में अपने अन्य कस्टम तत्व (UILabels और UIImageViews) जोड़ें।

अगला, निम्न कोड जोड़ें ताकि इसे MyView प्रारंभ होने पर कॉल किया जा सके (याद रखें, यदि आप एक निब से प्रारंभ करते हैं तो आप (आईडी) initWithCoder: (NSCoder *) aDecoder से प्राप्त हो जाएंगे)।

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; 
UIView *mainView = [subviewArray objectAtIndex:0]; 

//Just in case the size is different (you may or may not want this) 
mainView.frame = self.bounds; 

[self addSubview:mainView]; 

क्या करता है NSArray में अपने निब से देखने पदानुक्रम लोड करता है, और के बाद से आप केवल एक उच्च-स्तरीय UIView था, तो आप सिर्फ इतना है कि जोड़ने के अपने कस्टम UIView की एक subview के रूप।

यह आपको इंटरफ़ेस बिल्डर में UIViews (और UIView के अन्य सबक्लास) को डिज़ाइन करने की अनुमति देता है।

संपादित करें: ओपी के संपादन में अपडेट किया गया।

जिस तरह से मैंने हमेशा यह किया है, ऊपर दिए गए मेरे निर्देशों का पालन करके पहले किया गया है। एक अंतर यह है कि आपके बटनटेस्ट निब में आप UIView की कक्षा को बटनटेस्ट में बदल रहे हैं, लेकिन मैं फ़ाइल स्वामी की कक्षा को बटनटेस्ट में बदलता हूं। फिर, ButtonTest.m के अंदर, loadNibNamed सामान करें। अब, उस ऑब्जेक्ट को ButtonTestViewController.xib पर जोड़ने के लिए, एक UIView (या UIButton, जो भी बटनटेस्ट से उप-वर्गीकृत है) जोड़ें और कक्षा को बटनटेस्ट में बदलें।

यह थोड़ा उलझन में है, इसलिए मैं इसे फ़ाइल द्वारा तोड़ने की कोशिश करूंगा।

ButtonTestViewController.xib: एक UIButton जोड़ें (जो कुछ भी की ButtonTest से विरासत) और

ButtonTest.m ButtonTest के वर्ग बदलने के लिए: "initWithCoder" विधि के अंदर, "loadNibNamed" सामान मैं

ऊपर है सब करने के ButtonTest.xib: बटन की मालिक श्रेणी को बटनटेस्ट में बदलें और सभी आईबीओटलेट्स और आईबीएक्शन को लिंक करें

+0

मुझे लगता है कि ओपी इतनी दूर पहले से ही हो गया है। वह पूछ रहा है कि बाद में अन्य .xib फ़ाइलों में MyView.xib का उपयोग कैसे करें और कस्टम इंटरफ़ेस को पूरी तरह से संपादित करने में सक्षम हो। –

+0

मैट सही है, हालांकि मैंने एक नया प्रश्न के साथ सवाल संपादित किया। कृपया देख लीजिये। – Idan

+0

मैंने अपना उत्तर थोड़ा और स्पष्ट होने के लिए संपादित किया है। मुझे लगता है कि यह वही है जो आप करना चाहते हैं। – Ned

-1

यदि आपकी कक्षा यूआईबटन का उप-वर्ग है उदाहरण के लिए, आप इंटरफ़ेस बिल्डर में लाइब्रेरी खोल सकते हैं और जब आप खोजते हैं तो यह कक्षा टैब के नीचे होगा यह और आप खींच और छोड़ सकते हैं।

आप यूआईबटन को खींच/छोड़ सकते हैं और अपनी कक्षा इंस्पेक्टर फलक में सेट कर सकते हैं।

हालांकि, क्योंकि आपके पास अपना स्वयं का .xib है जो इसे गड़बड़ कर सकता है, इस मामले में बस मुझे अनदेखा करें।

5

आप में से कुछ टिप्पणी में तो यहां से पूछते हैं, अगर इस समाधान अनंत लूप का निर्माण नहीं करता और मैं वहाँ जवाब देने के लिए पर्याप्त प्रतिष्ठा नहीं है मेरी जवाब है:

पाश मौजूद है, तो अपने XIB में जड़ दृश्य "कस्टम क्लास" MyView पर सेट है। यह स्थिति का कारण बनता है जहां XIB से लोड दृश्य MyView के प्रारंभकर्ता को फिर से का आह्वान करता है और इसलिए, अनंत लूप बनाता है। समाधान यह है कि "कस्टम क्लास" UIView होना चाहिए और केवल फ़ाइल स्वामी की कक्षा को MyView पर सेट किया जाना चाहिए (IBOutlets और IBActions असाइन करने में सक्षम होने के लिए)।

1

स्विफ्ट 3,0

वर्ग

class ViewXIBfileClassView: UIView { 
..... 
} 

साथ तेजी से फ़ाइल बनाने बनाने xib साथ फ़ाइल दृश्य: ViewXIBfileClassView

आवरण दृश्य वर्ग बनाने

class ViewWrapper: UIView { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     let view = UINib(nibName: "ViewXIBfileClassView_file", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! viewXIBfileClassView 
     self.addSubview(view) 
     view.bindEdgesToSuperview() 
    } 
} 

ऐड विस्तार UIView

extension UIView { 
    /// Adds constraints to the superview so that this view has same size and position. 
    /// Note: This fails the build if the `superview` is `nil` – add it as a subview before calling this. 
    func bindEdgesToSuperview() { 
     guard let superview = superview else { 
      preconditionFailure("`superview` was nil – call `addSubview(view: UIView)` before calling `bindEdgesToSuperview()` to fix this.") 
     } 
     translatesAutoresizingMaskIntoConstraints = false 
     ["H:|-0-[subview]-0-|", "V:|-0-[subview]-0-|"].forEach { visualFormat in 
      superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: visualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) 
     } 
    } 
} 

उपयोग UIView ViewWrapper सभी XIB फ़ाइलों के अंदर करने के लिए साथ आप चाहते हैं