2013-09-23 4 views
6

मेरे पास UICollectionViewController एक संग्रह दृश्य प्रबंधित करना है जो विभिन्न ऐप राज्यों के लिए अलग-अलग लेआउट का उपयोग करता है। मैं अलग-अलग लेआउट के बीच संक्रमण के लिए -setCollectionViewLayout:animated: का उपयोग कर रहा हूं। मैं एक बुरा पहुँच त्रुटि हो रही हैं और यह बेहद को पता है कि वास्तव में मालिक संग्रह देखने के वर्तमान लेआउट (उदाहरण, एक strong संदर्भ के लिए रहता है) में मदद मिलेगी।UICollectionViewController का लेआउट स्वामित्व (self.collectionView.collectionViewLayout बनाम self.collectionViewLayout)

-setCollectionViewLayout:animated: कॉल करने के बाद, मैंने देखा है निम्नलिखित (जहां selfUICollectionViewController है):

  • self.collectionView.collectionViewLayout नए लेआउट देता है।
  • self.collectionViewLayout अभी भी पुराने लेआउट देता है।

    collectionViewLayout

    लेआउट संग्रह दृश्य नियंत्रक को प्रारंभ करने के लिए इस्तेमाल वस्तु:

यह UICollectionView Class Reference है, जो इस व्यवहार बताते हैं की जाँच करने के लिए मुझे का नेतृत्व किया। (केवल पढ़ने के लिए)

@property (nonatomic,readonly) UICollectionViewLayout *collectionViewLayout

चर्चा
यह गुण लेआउट वस्तु आप initWithCollectionViewLayout के लिए पारित शामिल हैं: विधि। इस प्रॉपर्टी में लेआउट ऑब्जेक्ट को संग्रह दृश्य में परिवर्तनों को प्रतिबिंबित करने के लिए अद्यतन नहीं किया गया है। आप इस प्रॉपर्टी का उपयोग लेआउट ऑब्जेक्ट को संदर्भित करने के लिए कर सकते हैं जिसे आपने मूल रूप से उपयोग करने के लिए संग्रह दृश्य कॉन्फ़िगर किया था।

ठीक है। तो self.collectionViewLayout प्रारंभिक लेआउट में एक कमजोर संदर्भ (या यह है?) है और self.collectionView.collectionViewLayout वर्तमान लेआउट का एक मजबूत संदर्भ है।

इस बात की पुष्टि करने के लिए, मैं डिबगर, में एक डुबकी ले लिया, लेकिन वास्तविक UICollectionView माना जाता है कि UICollectionViewController के स्वामित्व को खोजने के लिए सक्षम नहीं था। इसके बजाए, संग्रह दृश्य नियंत्रक का _view चर UICollectionViewControllerWrapperView का उदाहरण था। व्हाट?

इस पूरे अनुभव ने मुझे निम्न सवालों के साथ छोड़ दिया:

  1. कहाँ वास्तविक UICollectionView एक UICollectionViewController में जमा हो जाती है?
  2. self.collectionViewLayout प्रारंभिक जमाव के बारे में strong संदर्भ रखता है? UICollectionViewControllerWrapperView एक इवर _subviewCache कहा जाता है, जो सूचकांक 0. अजीब पर वास्तविक UICollectionView युक्त एक परिवर्तनशील सरणी है:

उत्तर

0

कहाँ वास्तविक UICollectionView एक UICollectionViewController में जमा हो जाती है?

यह वास्तव में आपके व्यवसाय का कोई भी नहीं है। मेरा मतलब है, यह दिलचस्प है कि आपको संग्रह दृश्य में एक पॉइंटर मिला, और आप शायद नियंत्रक के दृश्य पदानुक्रम के माध्यम से खोज कर एक और खोज सकते हैं। महत्वपूर्ण बात यह है कि आपको संग्रह दृश्य के बारे में चिंता करने के लिए UICollectionViewController देना चाहिए। मुझे पता है कि यह एक संतोषजनक उत्तर नहीं है जब आप यह पता लगाने की कोशिश कर रहे हैं कि आपका ऐप क्यों क्रैश हो रहा है, लेकिन डिबगिंग से अलग करना हमेशा एक अच्छा विचार है कि दृश्य नियंत्रक के विचारों के साथ गड़बड़ से बचें।

क्या self.collectionViewLayout प्रारंभिक लेआउट के लिए एक मजबूत संदर्भ रखता है?

प्रलेखन से परखने के बाद, हाँ। उद्देश्य-सी गुण strong by default हैं, और आप संपत्ति विनिर्देश से देख सकते हैं कि collectionViewLayout संपत्ति weak निर्दिष्ट नहीं करती है, इसलिए यह strong होना चाहिए।

आगे के सबूत आपके द्वारा उद्धृत दस्तावेज से आते हैं, जो मूल रूप से कहता है कि संपत्ति आरंभिक रूप से आपके द्वारा प्रदान किए गए लेआउट को एक सूचक प्रदान करती है। यह नहीं कहता है कि यदि आप लेआउट बदलते हैं तो यह संपत्ति nil लौटाएगी - यह कहने के तरीके से बाहर हो जाती है कि संपत्ति अपडेट नहीं की गई है और यदि आप लेआउट बदलते हैं तो भी मूल लेआउट को इंगित करना जारी रखता है।

2

ठीक है, मैं पहले से ही मेरा पहला प्रश्न का उत्तर दिया।

हालांकि, मैं अभी भी अपने दूसरे प्रश्न का उत्तर अच्छा लगेगा। ऐसा लगता है कि संग्रह दृश्य नियंत्रक प्रारंभिक लेआउट के लिए एक मजबूत संदर्भ रखते हुए नहीं है क्योंकि इसकी collectionViewLayout (प्रारंभिक लेआउट) संपत्ति केवल पढ़ने योग्य है, और संग्रह संग्रह का निरीक्षण करते समय मुझे संग्रह दृश्य लेआउट का कोई संदर्भ नहीं मिल रहा है डीबगर के चर दृश्य में नियंत्रक देखें। फिर भी, यदि यह मामला है, प्रारंभिक लेआउट के संग्रह दृश्य के मजबूत संदर्भ के बाद भी प्रारंभिक लेआउट पर यह कैसा चल रहा है, एक अलग लेआउट के मजबूत संदर्भ के साथ बदल दिया गया है?


अद्यतन: यह बुरा पहुँच दुर्घटना मैं देख रहा था वास्तव में UIDynamicAnimator के लेआउट के स्वामित्व के साथ क्या करना है कि एक अलग मुद्दा के कारण हुई थी पता चला है। यह लगभग निश्चित रूप से एप्पल के कोड में एक बग है, और मैं एक रडार जिसे आप यहां पढ़ सकते हैं दायर किया है (दोहराव स्वागत करते हैं!):

http://www.openradar.me/15062440

जिसके अनुसार, इस में से कोई भी तकनीकी रूप से मेरे दूसरे प्रश्न संबोधित करते हैं। यह अब मेरे या मेरे काम के लिए प्रासंगिक नहीं है, लेकिन मैं अभी भी किसी भी वास्तविक उत्तर का स्वागत और उन्नयन करता हूं, भले ही वे इस बिंदु पर पूरी तरह अकादमिक हों।

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