2013-09-24 9 views
6

मैं सिर्फ एक 'एकल दृश्य अनुप्रयोग' जो iOS7 को लक्षित करता है, लेकिन के लिए एक खाली आईओएस प्रोजेक्ट बनाया जब मैं खाली परियोजना भाग गया और लिखकर मेरी viewtree निरीक्षण:iOS7 खाली autolayout लेआउट पहले से ही अस्पष्ट

po [[UIWindow keyWindow] _autolayoutTrace] 

मुझे मिल गया नतीजा यह है कि दो लेआउट गाइड पहले से ही

*<UIWindow:0x108f537f0> - AMBIGUOUS LAYOUT 
| *<UIView:0x109409850> 
| | *<_UILayoutGuide:0x109409c10> - AMBIGUOUS LAYOUT 
| | *<_UILayoutGuide:0x10940a540> - AMBIGUOUS LAYOUT 

एक कारण उन चेतावनियों से छुटकारा पाने के है अस्पष्ट हैं - या मैं उन्हें अनदेखा कर सकते हैं?

उत्तर

5

आप उन्हें अनदेखा कर सकते हैं अगर आप न autolayout उपयोग करने के लिए या इंटरफ़ेस निर्माता पर जाने और लेआउट अपने आप को जोड़

enter image description here

+1

मैं ऑटोलायआउट का उपयोग करना चाहता हूं - लेकिन 'ऑटोलोडेड' दृश्य पहले से ही अस्पष्ट क्यों हैं? –

+0

बस इंटरफ़ेस बिल्डर पर जाएं और एक्सकोड सुझाए गए लेआउट जोड़ें, मुझे –

+1

धन्यवाद कैप्चर करने दें - मुझे लगता है कि यह अभी भी अजीब है कि उनके अपने विचार संदिग्ध हैं, लेकिन यह जानना अच्छा है कि मैं इसे अनदेखा कर सकता हूं। –

5

यह (आप भी XCode लेआउट यह सोचता है कि जरूरत है जोड़ने के लिए दे सकते हैं) चाहते हैं आईओएस 6 के साथ समान था।

मुझे लगता है कि कभी-कभी बाधाओं के लिए "बसने" के लिए समय लगता है और संदिग्ध नहीं होता है। डब्ल्यूडब्ल्यूडीसी 2012 वीडियो के मुताबिक "ऑटो लेआउट मास्टरिंग के लिए सर्वोत्तम प्रथाएं" अस्पष्टता को अस्थायी रूप से बर्दाश्त किया जा सकता है (असंतोष के विपरीत, जो तुरंत अपवाद उठाता है)।

आपको लगता है कि आपके बाधाओं अस्पष्ट शेष नहीं कर रहे हैं अपने आप को साबित करने के लिए चाहते हैं, तो [[UIWindow keyWindow] _autolayoutTrace] के लिए एक आवरण बना सकते हैं और थोड़ी देर के बाद यह कहते हैं:

- (void)viewDidAppear:animated 
{ 
    [super viewDidAppear:animated]; 

    [self performSelector:@selector(wrapperForLoggingConstraints) withObject:nil afterDelay:.3]; 
} 

- (void)wrapperForLoggingConstraints 
{ 
    [[UIWindow keyWindow] _autolayoutTrace]; 
} 

आप बनाने के लिए आदेश प्राप्त करने के लिए UIWindow पर एक वर्ग इस काम करने के लिए:

@interface UIWindow() 

+ (UIWindow *)keyWindow; 
- (NSString *)_autolayoutTrace; 

@end 

मैं अपने स्वयं के हेडर फाइल में इस श्रेणी में कहें, UIWindow_AutoLayoutDebug.h

कहाँ कभी मैं फोन [[UIWindow keyWindow] _autolayoutTrace] मेरे एप्लिकेशन में, मैं आयात UIWindow_AutoLayoutDebug.h

मैं पुस्तक "IOS 6 ट्यूटोरियल द्वारा" से कोड में [[UIWindow keyWindow] _autolayoutTrace] बुला के बारे में सीखा, खंड 1, द्वारा raywenderlich.com टीम। कॉल में देरी का विचार मेरा है।

+0

क्या कोई यह सत्यापित कर सकता है कि यह चाल वैध है? मुझे DidAppear में _autolayoutTrace को कॉल करने के बाद एक दृश्य में कई अजीब लेआउट चेतावनियां थीं। एक .3 दूसरी देरी के बाद _autolayoutTrace कॉल करने के बाद वे सब चले गए हैं। सिर्फ यह जानना है कि क्या यह भरोसा किया जा सकता है, मैं अभी भी ऑटो लेआउट सीख रहा हूं और यह सुनिश्चित करना चाहता हूं कि मैं सब अच्छा हूं। – jmurphy

+0

यह मेरे लिए काम नहीं करेगा क्योंकि यह संकलित नहीं होगा। आप केवल lldb सत्र के अंदर _autolayoutTrace को कॉल कर सकते हैं। यह ऊपर लिखे गए संकलन नहीं करेगा। आप UIView विधि 'hasAmbiguousLayout' को कॉल कर सकते हैं, लेकिन यह आपको एक दृश्य के बारे में बताता है, न कि इसके देवताओं। ऐसा करने के लिए, कोई भी सभी सबव्यूवर्स के माध्यम से पुन: सेवा करने के लिए एक विधि लिखता है और उनमें से प्रत्येक पर कॉल लाया जाता है। याद रखें, केवल विकास के समय के लिए, शिपिंग कोड के लिए नहीं। – idStar

+1

@idStar आपको UIWindow पर एक श्रेणी बनाना है (अद्यतन उत्तर देखें) – bilobatum

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