जब कोई दृश्य हटा दिया जाता है, तो बाधाओं के साथ क्या होता है


109

मेरे पास जो प्रश्न है वह सरल है लेकिन मुझे प्रलेखन में कोई जानकारी नहीं मिली।

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

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

तो क्या होता है अगर हम जोड़ने Aके लिए Cफिर से?

जवाबों:


118

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

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

7
क्या इस तथ्य को दस्तावेज में कहीं पाया जा सकता है? मेरा मानना ​​है कि यह अजीब लगता है लेकिन इस तथ्य का कहीं भी उल्लेख नहीं किया गया है।
सुल्तान

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

6
के रूप में स्पष्ट रूप से इस जवाब के लिए ऐसा लगता है कि यह होगा, यह अभी भी काफी मददगार था!
race_carr

1
@pnollet, मुझे नहीं पता कि उस प्रश्न में पोस्टर ने ऐसा क्यों किया। मैंने इसे सत्यापित करने के लिए लॉग इन किया है, और जब मैं एक सबव्यू हटाता हूं, और पर्यवेक्षक पर अवरोधों की जांच करता हूं, तो उन बाधाओं को हटा दिया गया जो हटाए गए सबव्यू से संबंधित हैं।
rdelmar

4
@ फ़िरो, मुझे यकीन है कि वे हटाए जाने वाले हैं, इसलिए यदि वे iOS 6 में नहीं हैं, तो संभवतः यह एक बग है। बीटीडब्ल्यू, रिमूवफ्रॉमसुपरिव्यू पद्धति के लिए डॉक्टर कहते हैं, "इस पद्धति को कॉल करने से आपके द्वारा हटाए जा रहे दृश्य को संदर्भित करने वाली किसी भी बाधा को हटा दिया जाता है, या जो आपके द्वारा हटाए जा रहे दृश्य के उपशीर्षक में किसी भी दृश्य को संदर्भित करता है"।
rdelmar

41

चूँकि मेरे पास यह प्रश्न भी था, इसलिए मैंने Apple डॉक्स को सिर्फ किक के लिए चेक किया, और यह पता चला कि यह प्रलेखित है कि अड़चनें दूर हो गई हैं।

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

इस विधि को कॉल करने से आपके द्वारा हटाए जा रहे दृश्य को संदर्भित करने वाली कोई भी बाधा दूर हो जाती है, या यह कि आपके द्वारा हटाए जा रहे दृश्य के सबट्री में किसी भी दृश्य को संदर्भित करता है।

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


इस सीधे डॉक से जोड़ने के लिए बहुत बहुत धन्यवाद
Esko918

3

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

आपको C को B में जोड़ने से पहले, बाधाओं को हटाने के लिए स्पष्ट रूप से [C removeFromSuperview] पर कॉल करना होगा।

यह मैक ओएस एक्स पर सच है - मैंने आईओएस की जांच नहीं की है


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

2

जब आप बाधाएं भी दूर हो जाती हैं [A removeFromSuperview]

उन्हें भुला दिया जाता है और A से C को फिर से जोड़ने पर कोई अड़चन नहीं आती।


0

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


0

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


4
स्टोरीबोर्ड कुछ भी साबित नहीं करता है कि रनटाइम व्यवहार कैसे होगा। स्टोरीबोर्ड जो चाहे कर सकता है!
mxcl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.