2013-09-04 7 views
84

मेरे पास जो प्रश्न है वह सरल है लेकिन मुझे दस्तावेज़ में कोई जानकारी नहीं मिली।जब कोई दृश्य हटा दिया जाता है तो बाधाओं के साथ क्या होता है

दृश्य पदानुक्रम (या किसी अन्य दृश्य में स्थानांतरित) से दृश्य हटा दिए जाने पर लेआउट बाधाओं के साथ क्या होता है?

उदाहरण के लिए, हमारे पास C सबवेव्यू A और B के साथ कंटेनरहै। कंटेनर C में कुछ बाधाएं हैं। फिर हम [A removeFromSuperview] पर कॉल करते हैं। A के लिए बाधाओं के साथ क्या होता है?

तब क्या होता है यदि हम AC फिर से जोड़ते हैं?

उत्तर

97

बाधाओं को हटा दिया जाता है। यदि आप फिर से जोड़ते हैं, तो आपको इसके लिए नई बाधाएं करनी होंगी, या यदि आप ए को हटाने से पहले बाधाओं को सहेज लेंगे, तो आप उन्हें वापस जोड़ सकते हैं। जब मैं कुछ इस तरह करते हैं, मैं एक दृश्य कहा View1 के लिए इस तरह की कमी को बचाने:

self.portraitConstraints = [NSMutableArray new]; 
for (NSLayoutConstraint *con in self.view.constraints) { 
    if (con.firstItem == self.view1 || con.secondItem == self.view1) { 
     [self.portraitConstraints addObject:con]; 
    } 
} 
+5

क्या यह तथ्य दस्तावेज़ीकरण में कहीं भी पाया जा सकता है? मैं आपको विश्वास करता हूं लेकिन यह अजीब लगता है कि तथ्य कहीं भी उल्लेख नहीं किया गया है। – Sulthan

+1

यह सामान्य बात है कि वास्तव में दृश्य के साथ बाधाओं को हटा दिया जाता है। यदि वे नहीं थे कि लेआउट सिस्टम भविष्य में पास में उनका मूल्यांकन कैसे कर पाएगा? –

+5

जैसा कि स्पष्ट है, इस उत्तर के जैसा लगता है, यह अभी भी बहुत उपयोगी था! –

2

जब आप [A removeFromSuperview]

वे भूल कर रहे हैं और सी के लिए एक जोड़ने फिर से बगैर किसी अड़चन कहते हैं की कमी भी निकाल दिए जाते हैं ।

1

वे भी हटा दिए जाते हैं, आप एक साधारण परीक्षण कर सकते हैं। एक दृश्य SUBVIEW उठाएं और सब्सक्रिप्शन को अपने पर्यवेक्षण आकार का पालन करने के लिए बाध्य करें (जैसे पर्यवेक्षण किनारों पर लगाए गए)। ऐसा करने के लिए आप इस CONTAINERVIEW के सबव्यूव्यू के रूप में SUBVIEW जोड़ते हैं और इस तरह की बाधाओं के रूप में जोड़ते हैं:
वी: | - [SUBVIEW] - |
एच: | - [SUBVIEW] - |
इन बाधाओं को SUBVIEW पर्यवेक्षण में जोड़ा जाना चाहिए, इस प्रकार CONTAINERVIEW।
यदि आप सभी CONTAINERVIEW बाधाओं को चेक करके SUBVIEW को हटाते हैं तो आप देख सकते हैं कि दो अब और नहीं हैं।

31

चूंकि मेरे पास यह प्रश्न भी था, इसलिए मैंने ऐप्पल डॉक्स को सिर्फ किक्स के लिए चेक किया, और यह पता चला कि यह दस्तावेज है कि बाधाओं को हटा दिया गया है।

documentation UIView removeFromSuperview विधि राज्यों के लिए:

इस विधि कॉलिंग किसी भी बाधाओं कि दृश्य आपको हटा रहे हैं का उल्लेख निकाल देता है, या कि किसी भी दृश्य को देखें दृश्य आपको हैं सबट्री में को हटाने।

मुझे यकीन है कि अगर यह पिछले साल जब मूल प्रश्न पोस्ट किया गया प्रलेखित किया गया था नहीं कर रहा हूँ, लेकिन मैं सिर्फ मैं इस जानकारी को साझा करता हूँ में मामला किसी को भी यह आवश्यक सोचा ...

+0

इस सीधे दस्तावेज़ को – Esko918

3

हालांकि ध्यान रखें, कि यदि आपके पास दो स्वतंत्र अभिभावक विचार ए और बी हैं, और एक सबव्यू सी है, जहां सी वर्तमान में ए की एक सबव्यू है, उचित बाधाओं के साथ, [बी एडस्यूब्यू: सी] कॉलिंग ए और सी से संबंधित किसी भी बाधा को साफ़ नहीं करेगा, और ऑटो लेआउट अपवाद फेंकना शुरू कर देगा, क्योंकि उन बाधाओं को एक ही पदानुक्रम में विचारों से संबंधित नहीं है।

सी से बी जोड़ने से पहले आपको बाधाओं को दूर करने के लिए [सी removeFromSuperview] को स्पष्ट रूप से कॉल करने की आवश्यकता होगी।

यह मैक ओएस एक्स पर सही है - मैं आईओएस

+0

से जोड़ने के लिए बहुत बढ़िया धन्यवाद! ये जानकारी तुम्हें कहाँ से मिली? AddSubview के लिए दस्तावेज़ इस व्यवहार का उल्लेख नहीं करते हैं। मैं पूछ रहा हूं क्योंकि वर्तमान में एक व्यूअर अपवाद है, जब एक व्यू कंट्रोलर को हटाते हैं, जो 'दृश्य पर बाधा स्थापित करने में असमर्थ' कहता है - जो कुछ मैं नहीं कर रहा हूं। – JimmyB

0

यह सवाल भी इंटरफ़ेस बिल्डर ने साबित कर दिया जा सकता है की जाँच नहीं की है। ViewController पर UIView खींचें और छोड़ें जब बाधाएं जोड़ें तो UIView हटाएं, आप देख सकते हैं कि नीली बाधाएं गायब हो गई हैं।

+0

Underrated उत्तर, मुझे लगता है कि यह काम करेगा। –

+0

स्टोरीबोर्ड रनटाइम व्यवहार कैसे होगा इसके बारे में कुछ भी साबित नहीं करता है। स्टोरीबोर्ड जो कुछ भी चाहता है वह कर सकता है! – mxcl

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

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