2013-08-23 14 views
12

के साथ ऑटोलायआउट त्रुटि मेरे पास एक टेबल व्यू है और मैं प्रत्येक विधि के लिए प्रतिनिधि विधि tableView:heightForRowAtIndexPath: का उपयोग करके ऊंचाई निर्दिष्ट करता हूं।UITableView

जब मैं दृश्य को घुमाता हूं तो मुझे यह त्रुटि मिलती है जिसे मैं समझ में नहीं आता।

यह नीचे की बाधा को पूरा नहीं कर सकता है और जारी रखने के लिए इसे तोड़ सकता है।

"<_UIScrollViewAutomaticContentSizeConstraint:0x8e8d040 UITableView:0x9423400.contentHeight{id: 213} == -1568.000000>" 

क्या कोई जानता है कि क्या हो रहा है और मैं इस बाधा को क्यों तोड़ रहा हूं?

उत्तर

1

अपने

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

कार्यान्वयन डिबग करने के लिए प्रयास करें। मेरे मामले में यह कुछ दुर्लभ मामलों में एक नकारात्मक पूर्णांक लौटा रहा था, जिसके परिणामस्वरूप मेरे लॉग में दिखाई देने वाला संदेश और मेरे टेबल व्यू के स्क्रॉलिंग व्यवहार के साथ गड़बड़ हो रहा था।

12

tl; डॉ: वास्तविक ऊंचाई के मान क्या आप अनुमान से काफी अलग के लिए देखो। या वास्तविक मान जो नकारात्मक हैं या 0 हैं।


मैंने इस बाधा अपवाद को डिबग करने में कुछ मिनट बिताए हैं। मेरे पास कक्ष, सेक्शन हेडर और सेक्शन फूटर के साथ UITableView है। इनमें से प्रत्येक आईओएस 7 estimatedHeightFor संदेशों को परिभाषित किया गया था, static const मूल्य लौटा रहा था। मैंने कोशिकाओं, शीर्षकों और पाद लेखों को हटा दिया, एक समय में जब तक मैंने यह निर्धारित नहीं किया कि यह मुद्दा पाद लेख से आ रहा था (यदि आपके पास पाद लेख नहीं हैं तो महत्वपूर्ण नहीं है, कृपया पढ़ें)।

यदि मैंने estimatedHeightForFooterInSection: को हटा दिया, तो अपवाद गायब हो गया। मेरे heightForFooterInSection: में, एक पथ है जिसमें पाद लेख की ऊंचाई 0 होगी। जब मैंने estimatedHeight संदेश को पुनर्स्थापित किया और 0 की वास्तविक ऊंचाई के लिए कोड पथ को हटा दिया, तो अपवाद भी चला गया। मैंने 0 को 22 के साथ बदल दिया और अपवाद को फिर से प्रकट होने से पहले इस मान को 12 तक घटा दिया।

भले ही, मैं पाद लेख की ऊंचाई की जरूरत 0 होने के लिए (मैं उस मामले में viewForFooterInSection: से nil वापसी) और मैं ऊंचाई (मैं गतिशील पाठ का समर्थन कर रहा हूँ) अनुमान लगाने के लिए सक्षम होना चाहते हैं। मेरा समाधान कोड पथ के लिए खाता था जो मुझे ऊंचाई estimatedHeightForFooterInSection: में देगी। एक बार मैंने इसे जोड़ा, अपवाद दूर चला गया।

16

अद्यतन: यह समस्या आईओएस 8 में अब प्रासंगिक नहीं है, जो स्वयं आकार देने वाली कोशिकाओं के लिए समर्थन जोड़ती है। यह अभी भी आईओएस 7 के लिए प्रासंगिक है।

मूल जवाब (आईओएस 7):

ग्रेग के जवाब निश्चित रूप से मेरे लिए काम किया - मैं अपने tableView डिबग करने के लिए की जरूरत: estimatedHeightForRowAtIndexPath: विधि।मैं कुछ डिबगिंग और कुछ त्वरित प्रयोग किया था और यहाँ कुछ चीजें मुझे पता चला रहे हैं:

  1. अनुमान पंक्ति तरीकों में UITableViewAutomaticDimension प्रयोग न करें। यह स्थिरता हेडर और पाद लेख विधियों के लिए है। मुझे लगता है कि जब मैं प्रलेखन पढ़ता हूं तो मैं पर्याप्त ध्यान नहीं दे रहा था :) अद्यतन: UITableViewAutomaticDimension का उपयोग अब आईओएस 8 में पंक्ति ऊंचाई के लिए किया जा सकता है, स्वयं आकार देने वाली कोशिकाओं की कार्यक्षमता का हिस्सा।

  2. 1.0 परिणामों की पंक्ति ऊंचाई का आकलन अपवाद में: "एनएसआईएननल इन्फॉन्सिस्टेंसी अपवाद", कारण: 'तालिका दृश्य पंक्ति ऊंचाई नकारात्मक नहीं होनी चाहिए ...' "1.0 से कम अनुमानित अजीब परिणाम भी हैं।

  3. 2.0 और वास्तविक कार्यों के बीच अनुमान किसी भी अपवाद के बिना ठीक है (हालांकि 2.0 शायद अनुकूलन कारणों के लिए एक खराब विकल्प है - आप यथासंभव वास्तविक के करीब होना चाहते हैं)।

  4. बाधा अपवाद केवल तब होता है जब अनुमानित पंक्ति ऊंचाई वास्तविक पंक्ति ऊंचाई से अधिक है। जितना करीब आप वास्तविक हैं, अपवाद कम होने की संभावना कम होगी। अपवाद प्राप्त करने से पहले आपके अनुमान कितने दूर हो सकते हैं, कई अलग-अलग कारकों से संबंधित: वास्तविक पंक्ति ऊंचाई, पंक्ति की स्थिति इत्यादि

+0

+1 # 4 के लिए +1। एफडब्ल्यूआईडब्ल्यू इस बाधा अपवाद आईओएस 7 में होता है लेकिन 8 में नहीं। –

+0

@ रिचर्डशिन नोट के लिए धन्यवाद। मैंने यह जवाब देने के लिए अपना जवाब अपडेट किया कि कार्यक्षमता आईओएस 8 में काफी बदल गई है। –

+0

दूसरा मामला आईओएस 10 के लिए वास्तविक है। यह आईओएस 11 में तय किया गया था। एक त्वरित नमूना: https://github.com/OlesyaS/UITableView-ios10-crash/blob/master/table/ViewController.m –