2016-10-04 17 views
9

10.12 में कई बड़े बदलाव हैं, लेकिन मेरी राय में सबसे बड़ी नई ऑटो-लेआउट प्रणाली (या संशोधित/पुराने लिखने वाले पुराने ... जो जानता है)। मैंने इस मुद्दे को प्रदर्शित करने के लिए एक सरल परियोजना तैयार की है। यह एक बटन के माध्यम से एक विभाजित दृश्य आइटम को ध्वस्त करने से संबंधित है। यह केवल 10.12 पर होता है। आपको बस इतना करना है कि परियोजना को संकलित करना और बटन पर क्लिक करना है। एक त्रुटि प्रस्तुत की जाएगी:मैकोज़ 10.12 ऑटो-लेआउट समस्याएं

2016-10-04 15: 10: 28.284296 परीक्षण -12 [64 9 32: 7425277] [लेआउट] के लिए गायब बाधाओं का पता चला। इसे रखा नहीं जा सकता क्योंकि आकार और उत्पत्ति को पूरी तरह से परिभाषित करने के लिए पर्याप्त बाधाएं नहीं हैं। लापता बाधाओं को जोड़ें, या अनुवाद सेट करेंअटोरोज़ाइजिंग MaskIntoConstraints = हाँ और बाधाएं आपके लिए उत्पन्न की जाएंगी। यदि यह दृश्य मैकोज़ 10.12 और बाद में मैन्युअल रूप से निर्धारित किया गया है, तो आप अपने ओवरराइड से [सुपर लेआउट] को कॉल नहीं करना चुन सकते हैं। डिबग करने के लिए DETECTED_MISSING_CONSTRAINTS पर ब्रेकपॉइंट सेट करें। यह त्रुटि केवल एक बार लॉग इन होगी।

(lldb) po $arg1 
<NSSplitDividerView: 0x618000161980> 

Am मैं पूरी तरह से गलत है या वहाँ 10.12 के साथ एक निश्चित समस्या है:

एक ब्रेकपाइंट हम पता कर सकते हैं कि समस्याग्रस्त दृश्य है स्थापित करने के बाद? और कृपया सलाह दें कि यदि संभव हो तो इस प्रकार की त्रुटियों को कैसे रोकें।

परियोजना github

से डाउनलोड किया जा सकता एक बार फिर मदद के लिए धन्यवाद।

मैं निकोलोव

+2

मैं इस संदेश को केवल NSAlert.layout() पर कॉल करके ट्रिगर कर सकता हूं ताकि अलर्ट को तत्काल बाहर निकालने के लिए मजबूर किया जा सके। चूंकि इस मामले में कोई भी सुझाव काम नहीं करता है और त्रुटि से बचने के लिए कोई स्पष्ट तरीका नहीं है, इसलिए मैंने एक रडार दायर किया (rdar: // 28700495)। – rsfinn

+4

मैं 'स्प्लिट व्यू' से 'झूठी' लौटकर इस मुद्दे का समाधान करता हूं (_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> मेरे 'NSSplitViewController' में बूल'। – LShi

+0

@LShi: धन्यवाद मुझे एक ही समस्या थी और यह मेरे लिए भी काम करता था। – mschmidt

उत्तर

0

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

// Left Split View 
    [self.scrollviewMain setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainLeft addSubview:self.scrollviewMain]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
    // Right Split View 
    [self.scrollviewDetails setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainRight addSubview:self.scrollviewDetails]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant-1]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
+0

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

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