मेमोरी लीक की जांच करते समय मैंने setRootViewController:
एक संक्रमण एनीमेशन ब्लॉक के अंदर कॉलिंग की तकनीक से संबंधित एक समस्या की खोज की :
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
यदि पुराना दृश्य नियंत्रक (जिसे प्रतिस्थापित किया जा रहा है) वर्तमान में एक अन्य दृश्य नियंत्रक प्रस्तुत कर रहा है, तो उपरोक्त कोड दृश्य पदानुक्रम से प्रस्तुत दृश्य को नहीं हटाता है।
यही है, संचालन का यह क्रम ...
- एक्स रूट व्यू कंट्रोलर बन जाता है
- X, Y को प्रस्तुत करता है, ताकि Y का दृश्य स्क्रीन पर हो
transitionWithView:
Z को नया रूट व्यू कंट्रोलर बनाने के लिए उपयोग करना
... उपयोगकर्ता के लिए ठीक लग रहा है, लेकिन डीबग व्यू पदानुक्रम उपकरण से पता चलेगा कि वाई का दृश्य अभी भी जेड के दृश्य के पीछे है, अंदर UITransitionView
। अर्थात्, ऊपर के तीन चरणों के बाद, दृश्य पदानुक्रम है:
- UIWindow
- UITransitionView
- UIView (Y का दृश्य)
- उविवि (जेड का विचार)
- UITransitionView
मुझे संदेह है कि यह एक समस्या है क्योंकि, संक्रमण के समय, X का दृश्य वास्तव में दृश्य पदानुक्रम का हिस्सा नहीं है।
अगर मैं dismissViewControllerAnimated:NO
पहले एक्स को भेजता हूं transitionWithView:
, तो परिणामी दृश्य पदानुक्रम है:
- UIWindow
- UIView (X का विचार)
- उविवि (जेड का विचार)
यदि मैं dismissViewControllerAnimated:
X को YES (NO या NO) भेजता हूं , तो completion:
ब्लॉक में संक्रमण का प्रदर्शन करता हूं , तो दृश्य पदानुक्रम सही है। दुर्भाग्य से, यह एनीमेशन में हस्तक्षेप करता है। यदि बर्खास्तगी को एनिमेट करते हुए, यह समय बर्बाद करता है; यदि एनिमेशन नहीं है, तो यह टूटा हुआ दिखता है।
मैं कुछ अन्य तरीकों की कोशिश कर रहा हूं (जैसे, मेरे रूट व्यू कंट्रोलर के रूप में सेवा करने के लिए एक नया कंटेनर व्यू कंट्रोलर क्लास बना रहा हूं) लेकिन ऐसा कुछ भी नहीं मिला जो काम करता हो। जैसे ही मैं जाऊंगा मैं इस सवाल को अपडेट कर दूंगा।
अंतिम लक्ष्य प्रस्तुत दृश्य से सीधे एक नए रूट व्यू कंट्रोलर से संक्रमण करना है, और चारों ओर आवारा दृश्य पदानुक्रम को छोड़कर।
UIWindow
है तो क्या करना है, लेकिन ज्यादा प्रयोग करने का समय नहीं है।