2016-02-17 17 views
7

मैं स्टोरीबोर्ड संपादक में UIViewController में UILabel (राशि लेबल) जोड़ता हूं। और फिर स्विफ्ट फ़ाइल में, viewDidLoad, मैं प्रोग्रामिक रूप से UITextField (भुगतान टेक्स्टक्ल्ड) बना देता हूं और amountLabel और paymentTextField के बीच एक बाधा जोड़ने की कोशिश करता हूं। यहाँ viewDidload में मेरे कोड है:स्विफ्ट जोड़ें बाधा प्रोग्रामेटिक

let paymentTextField = UITextField() 
    paymentTextField.translatesAutoresizingMaskIntoConstraints = false 
    paymentTextField.frame = CGRectMake(15, 100, CGRectGetWidth(self.view.frame) - 30, 44) 
    self.view.addSubview(paymentTextField) 

    let bottonConstraint = NSLayoutConstraint(item: paymentTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.amountLabel , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 30) 
    bottonConstraint.identifier = "paymentTextFieldSpacing" 
    NSLayoutConstraint.activateConstraints([bottonConstraint]) 

लेकिन मैं कोई त्रुटि मिलती है:

"Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with items > and > because they have no common ancestor. Does the constraint reference items in different view hierarchies? That's illegal."

किसी को क्या गलत है पता है? amountLabel सीधे स्टोरीबोर्ड में दृश्य में खींचा गया है और "भुगतान टेक्स्टक्ल्ड" को उसी दृश्य में प्रोग्रामेटिक रूप से जोड़ा गया है। वे कोई आम पूर्वज क्यों नहीं हैं?

उत्तर

4

त्रुटि बताती है कि "क्योंकि उनके पास कोई सामान्य पूर्वज नहीं है", जिसका अर्थ है कि वे एक ही माता-पिता को साझा नहीं करते हैं। दो वस्तुओं के बीच बाधा को जोड़ने के लिए, उन्हें एक बच्चे-अभिभावक संबंध या भाई होना चाहिए।

अपने मामले में केवल यह सुनिश्चित करें कि बाधाओं को प्रोग्रामेटिक रूप से जोड़ने से पहले उनके पास एक ही मूल दृश्य है।

+1

आपके उत्तर के लिए धन्यवाद। मैं यह नहीं समझ सका कि कैसे लैबेल और भुगतानटेकफ़ील्ड को उसी माता-पिता को देना है। मैंने स्टोरीबोर्ड में राशि लेबल खींच लिया और उसके माता-पिता को बाहरी दृश्य होना चाहिए। मैंने selfTview के लिए प्रोग्रामेटिक रूप से भुगतानTextField जोड़ा और इसके माता-पिता को बाहरी दृश्य भी होना चाहिए। उनके पास अलग-अलग माता-पिता कैसे हैं? – jimshicard

+1

क्या आपने पुष्टि की है कि उनके पास समान माता-पिता हैं, जैसे प्रिंटिंग TextField.superview? यदि वे नहीं करते हैं, तो स्टोरीबोर्ड बाहरी दृश्य से नियंत्रक को आईबीओटलेट खींचें और सबव्यूव के रूप में भुगतान टेक्स्टफिल्ड जोड़ने के लिए इसका उपयोग करें। साथ ही, सुनिश्चित करें कि आप addSubview कॉल के बाद बाधा जोड़ रहे हैं, पहले नहीं। – Pauls

40

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

पहले देखने के लिए सबव्यू जोड़कर, यह सुनिश्चित करता है कि दोनों विचारों में एक ही माता-पिता हों।

बहुत देर हो चुकी है, लेकिन उम्मीद है कि यह किसी और की मदद करेगा। इस समस्या के लिए

+0

मैं इसे सत्यापित कर सकता हूं। यह तब हुआ जब मैंने बाधाओं को सक्रिय करने की कोशिश की लेकिन सुपर व्यू में सबव्यूज़ जोड़ने को भूल गए। – christostsang

8

चेकलिस्ट:

  • चेक कि क्या आप को सक्रिय करने की कमी से पहले अपनी मूल को प्रोग्रामेटिक रूप से बनाने दृश्य जोड़ा गया
  • चेक आप viewDidLoad() के अंदर की कमी सक्रियण कोड लिखने कि क्या/viewWillAppear()। आपको अद्यतन ViewConstraints या viewWillLayoutSubviews में बाधा सक्रियण कोड लिखना चाहिए। (suggested by vmeyer)
  • जांचें कि क्या आप अनुवाद बंद कर रहे हैंऑटोरोसिंगमास्कइनटो कॉन्स्ट्रेन
संबंधित मुद्दे