iOS8 - बाधाओं ने अस्पष्ट रूप से शून्य की ऊंचाई का सुझाव दिया है


100

क्या किसी को कोई विचार है कि यह कैसे डिबग करें?

केवल एक बार चेतावनी: एक ऐसे मामले का पता लगाया जहां अड़चनें एक टेबलव्यू सेल के सामग्री दृश्य के लिए शून्य की ऊंचाई का सुझाव देती हैं। हम अनजाने में पतन पर विचार कर रहे हैं और इसके बजाय मानक ऊंचाई का उपयोग कर रहे हैं।

पंक्तियों की एक निश्चित ऊँचाई होती है जैसा कि निर्धारित होता है

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}

और सभी constraintsखुश लग रहे हैं ...

जवाबों:


129

वापसी की ऊंचाई और अनुमानित ऊंचाई के कारण मेरे मामले में चेतावनी गायब हो गई।

- (CGFloat)tableView:(UITableView *)tableView 
           estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

एक और समाधान जहां आपको दो ओवरराइड की आवश्यकता नहीं है, बस self.tableView.rowHeight = 44;अपने loadViewया init पद्धति में उपयोग करना है ।


1
मेरे पास अनुभाग में कई प्रकार की पंक्तियाँ हैं और उनमें से केवल एक में गतिशील ऊंचाई है। तब यह काम नहीं कर रहा है
राज अग्रवाल

यदि हम xib / स्टोरीबोर्ड में डिफ़ॉल्ट ऊंचाई सेट करते हैं, तो हमें इन विधियों को लागू करने की आवश्यकता नहीं है।
सत्यम

77

जो भी किया जा सकता है वह ऊपर से और सामग्री के दृश्य के नीचे से लंबवत बाधाओं को जोड़ रहा है। यह ऑटोलैयूट को खुश कर देगा (क्योंकि अब वह जानता है कि सेल की ऊंचाई की गणना कैसे की जाए)।


2
इसने मेरे लिए काम किया। मैं सभी कंटेनर कोशिकाओं के माध्यम से चला गया और सुनिश्चित किया कि कम से कम एक सबव्यू में "कंटेनर के लिए शीर्ष स्थान" और "कंटेनर के लिए नीचे की जगह" दोनों बाधाएं हैं।
Rog182

7
आत्म-आकार तालिका दृश्य कक्षों का उपयोग करते समय iOS 8 के लिए यह सही उत्तर है।
tsafrir

1
क्या आपका मतलब है कि सामग्री के अंदर के तत्व से सामग्री के दृश्य के ऊपर और नीचे के तत्वों की कमी है?
ज़ैक शापिरो

मैंने यह कोशिश की, लेकिन मुझे परस्पर विरोधी अड़चनें आती रहती हैं।
शिरीष कुमार

2
सुनिश्चित करें कि आप सेल के सामग्री दृश्य में ऊपर और नीचे की बाधा जोड़ रहे हैं, सेल स्वयं नहीं। आप सेल करने के लिए बाधा जोड़ते हैं, तो कोड को अभी भी काम लेकिन 0. की ऊंचाई का उपयोग करने का प्रयास करेंगे होगा
frin

26

यदि आप AutoLayout बाधाओं और UITableViewAutomaticDimension का उपयोग कर रहे हैं, तो यह त्रुटि कोड में आपकी ऊंचाई को ओवरराइड करके खारिज करने के लिए कुछ गलत समस्या नहीं है। इसका मतलब है कि सेल की ऊंचाई का निर्धारण स्वचालित रूप से काम नहीं कर रहा है क्योंकि आपके पास आवश्यक ऊर्ध्वाधर बाधाओं की आवश्यकता नहीं है।

यदि आप मेरे जैसे हैं और आपको यह त्रुटि मिल रही है और यह पहचानने में मदद चाहिए कि कौन सी सेल त्रुटि फेंक रही है, तो आप अपने 'heightforRowAtIndexPath' विधि की वापसी से ठीक पहले निम्न पंक्ति जोड़ सकते हैं।

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

यह अनुभागों और पंक्तियों की एक लंबी सूची का प्रिंट आउट लेगा, लेकिन त्रुटि उस विशेष सेल के तुरंत बाद दिखाई देगी जो त्रुटि पैदा कर रही है, और आप जल्दी से पहचान सकते हैं कि कौन सी सेल समस्या पैदा कर रही है और तदनुसार अपनी बाधाओं को ठीक करें। यह स्थैतिक कोशिकाओं के लिए विशेष रूप से सहायक है। मैन्युअल रूप से दर्ज की गई संख्या के साथ ऊंचाई को ओवरराइड करना यदि आप ऑटोलेयआउट और स्वचालित सेल ऊंचाइयों का उपयोग नहीं कर रहे हैं, लेकिन इन सुविधाओं को अनिवार्य रूप से अक्षम कर देगा जो एक बहुत ही खराब समाधान है अगर इसकी कुछ आप उपयोग करने की कोशिश कर रहे हैं।

यदि आप पहले 'heightForRowAtIndexPath' विधि का उपयोग नहीं कर रहे थे, लेकिन अपनी UITableViewAutomaticDimension सेटिंग को पूर्ववत किए बिना इस त्रुटि को डीबग करना चाहते हैं, तो बस इसे अपने कोड में जोड़ें:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

आपका बहुत बहुत धन्यवाद। इसने मेरी बहुत मदद की। पहले तो मैंने सोचा, यह समस्या एक अन्य टेबल व्यू सेल के साथ थी। डिबगिंग के बाद यह पता चला, वह समस्या दूसरे के साथ थी।
एकोजी

मैं ऐसा करना चाहता हूं, लेकिन लंबी, अनुभाग और पंक्ति अज्ञात हैं। क्या आप स्पष्ट कर सकते हैं कि स्विफ्ट में ये क्या होना चाहिए?
DrWhat

9

XCode 6.1 में एक बग दिखाई देता है जो ऑटो-लेआउट का उपयोग करते समय इस समस्या का कारण बनता है और आप प्रत्येक तालिका दृश्य सेल के लिए पंक्ति ऊंचाई के लिए कोई मान निर्दिष्ट नहीं करते हैं, लेकिन इसके बजाय आप "डिफ़ॉल्ट" मान छोड़ देते हैं। बस प्रत्येक सेल के लिए, रो ऊंचाई के बगल में "कस्टम" चेकबॉक्स की जांच करना, चेतावनी को दूर कर देता है।


2
यदि आप स्व-साइटिंग सेल का उपयोग कर रहे हैं तो आपको पंक्ति की ऊँचाई को "डिफ़ॉल्ट" पर सेट करना होगा।
फतमान

1
इससे चेतावनी हल हो गई। लेकिन मेरा मानना ​​है कि यह केवल तब दिखाई देता है जब TableView
MontiRabbit

1
@phatmann यह समस्या केवल स्थैतिक कोशिकाओं के लिए दिखाई देती है इसलिए कोशिकाओं को स्व-आकार नहीं होना चाहिए।
ltm

@ अगर स्व-कोशिकाएँ उपयोगी हो सकती हैं, तो स्थैतिक कोशिकाओं में, यदि उपयोगकर्ता ने पाठ को बड़ा किया है, तो वह उपयोगी नहीं हो सकता है? (आप जानते हैं, iPhone सेटिंग्स में पहुंच के तहत)
बायरन कोएट्सी

मुझे लगता है कि यह बग नहीं है, यह ऊर्ध्वाधर बाधाओं के साथ एक समस्या हो सकती है, उन्हें सेल की ऊंचाई का पूरी तरह से वर्णन करना होगा, कम से कम स्वचालित आयाम के साथ टेबलव्यू के लिए।
जुआनजो

3

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


3

बाधाएं लेआउट के उद्देश्य से खुश हो सकती हैं, लेकिन स्वचालित पंक्ति ऊंचाई के उद्देश्य के लिए खुश नहीं हैं। एक खुश लेआउट का मतलब होगा कि सामग्री अस्पष्टता के बिना रखी जा सकती है। कि इंटरफ़ेस बिल्डर में चेक को संतुष्ट करेगा।

स्वचालित पंक्ति ऊंचाई के लिए एक खुश लेआउट का मतलब होगा कि, उपरोक्त के अलावा, आप सेल के निचले हिस्से में बाधाओं को भी शामिल कर सकते हैं।

यहां अधिक: एक ऐसे मामले का पता लगाया जहां बाधाओं को अस्पष्ट रूप से शून्य की ऊंचाई का सुझाव दिया जाता है


3

मैंने तालिका दृश्य आकार निरीक्षक में पंक्ति ऊँचाई 43 (या <> 44) का उपयोग किया और त्रुटि गायब हो गई। 44 का उपयोग करके मुझे त्रुटि मिलती है। Xcode संस्करण 6.0.1।

- यह उत्तर एक मॉडरेटर द्वारा हटा दिया गया था, कृपया समस्या को हल न करें। यह मेरे लिए समस्या को हल करता है और दूसरों के लिए भी कर सकता है। तो क्या आप फिर से इसे हटाने के लिए इतने दयालु हो सकते हैं।


2

मुझे चेतावनी को हटाने के लिए नहीं मिला, लेकिन बाधाओं को काम करने के लिए मैंने नया सेट किया, iOS8 में नया, estimatedRowHeightनिश्चित ऊंचाई तक मेज़पोश संपत्ति , और heightForRowAtIndexPathकार्यान्वयन को हटा दिया ।


यदि यह चेतावनी को हटा नहीं है, तो यह वह प्रणाली है जो लापता बाधा के लिए बना रही है और पंक्ति ऊंचाई == को cell.rowHeight संपत्ति में सेट कर रही है। चेतावनी एक ऑटो चंगा संपत्ति के बारे में है, अगर यह ऑटो चंगा है कि इसका मतलब समस्या नहीं थी?
पेड्रो बोर्ग्स

2

यदि आपको वह चेतावनी मिल रही है, तो इसकी सबसे अधिक संभावना है क्योंकि आप ऑटो लेआउट का उपयोग कर रहे हैं और आपकी कोशिकाओं को उनके अंदर कोई बाधा नहीं है।

आपको या तो ऑटो लेआउट का उपयोग करना बंद कर देना चाहिए या उन बाधाओं को लागू करना चाहिए जो कोशिकाओं की ऊंचाई को स्पष्ट रूप से परिभाषित करते हैं।

आप दाईं ओर फ़ाइल इंस्पेक्टर में "ऑटोलयूट का उपयोग करें" विकल्प को अनचेक करके ऑटो लेआउट को ऑटो लेआउट में बंद कर सकते हैं।

यदि आप ऑटो लेआउट का उपयोग करना चुनते हैं और आपकी कोशिकाओं की ऊंचाई तय है, तो उचित बाधाओं को लागू करना आसान होना चाहिए। बस सेल के कंटेंट व्यू के सबव्यू के लिए ऊंचाई की बाधाओं को जोड़ें, और इंटरव्यू के बीच, और इंटरव्यू और कंटेंट व्यू के बीच वर्टिकल स्पेस की कमी को लागू करें। उदाहरण के लिए यदि आपके सेल में एक लेबल है, तो यह काम करेगा:

लंबवत अवरोध

  1. सामग्री दृश्य के शीर्ष और लेबल के शीर्ष के बीच ऊर्ध्वाधर स्थान की बाधा
  2. लेबल की निश्चित ऊंचाई बाधा
  3. लेबल के नीचे और सामग्री दृश्य के नीचे के बीच लंबवत स्थान की बाधा

क्षैतिज बाधा

  1. सामग्री दृश्य के प्रमुख किनारे और लेबल के अग्रणी किनारे के बीच क्षैतिज स्थान की बाधा
  2. लेबल की निश्चित चौड़ाई की बाधा
  3. लेबल के अनुगामी किनारे और सामग्री दृश्य के अनुगामी किनारे के बीच क्षैतिज स्थान की बाधा

मैं बाधाओं का उपयोग कर रहा हूं, और वे सभी खुश लग रहे हैं, जैसा कि प्रश्न में उल्लेख किया गया है।
क्रिस

क्या वे सेल के सामग्री दृश्य के साक्षात्कार के लिए बाधा हैं? वो कैसे दीखते है? क्या यह संभव है कि आपके पास कुछ कोशिकाएं हैं जो अलग हैं? यदि आप फ्रेडरिक बोनर के समाधानों का उपयोग करके एक निश्चित ऊँचाई वाले कोशिकाओं को परिभाषित कर रहे हैं, तो बाधाओं को ओवरराइड किया जा रहा है।
०६:४६ बजे ६१

1

आप अपने लिए सही ऊंचाई की गणना करने के लिए ऑटलैटआउट का उपयोग कर सकते हैं। यहाँ iOS 8 पर डायनामिक सेल ऊँचाई के बारे में एक अच्छी पोस्ट है: http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/


काश, यह इतना आसान होता। इन दोनों पंक्तियों को जोड़ने से मेरी ऑटो समस्या को दुर्भाग्य से ठीक नहीं किया गया
Zack Shapiro

1

में स्विफ्ट के लिए मजबूर कर एक वापसी ऊंचाई मेरी समस्या तय:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

एक दलदल मानक तय करने के लिए, कोई अड़चन नहीं, कोई अनुमान लगाने वाली ऊंचाइयां, या समस्या पर इंजीनियरिंग नहीं। मैंने एक डिफ़ॉल्ट प्रोजेक्ट बनाया, टेबलव्यू को तार-तार कर दिया, लेकिन व्यू कंट्रोलर में ऊँचाई के प्रतिनिधि को रखना भूल गया । बस इस चेतावनी को दूर करने के लिए आपको इसकी आवश्यकता है।

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 44;
}

आपकी तालिका के दृश्य नियंत्रक में।


1

मैं uitableviewcell के अंदर एक mapView का उपयोग कर रहा था। मैंने डिवाइस स्क्रीन आकार के मानचित्र दृश्य की ऊंचाई को 1 / 3th में बदल दिया है। मुझे भी यही त्रुटि मिली। मैंने त्रुटिहीन बाधाओं को uitableviewcell की सामग्री दृश्य में जोड़कर त्रुटि को ठीक किया।

1) कंटेंट व्यू बाधाओं को दूर करें।

2) सेट कॉन्स्टिट्यूशन को सुझाव स्थिरांक पर सेट करें।

यहां छवि विवरण दर्ज करें

3) लापता बाधाओं को जोड़ें - यदि कोई हो

4) हम सुनिश्चित करते हैं कि सामग्री दृश्य में सभी आवश्यक बाधाएँ हैं। यहां छवि विवरण दर्ज करें


0

मेरे मामले में, यह इसलिए है क्योंकि मैं सेल को xib के साथ डिजाइन कर रहा हूं, और मैं उस xib फाइल को लक्ष्य में जोड़ना भूल गया हूं।

जब मैं उस xib फ़ाइल को लक्ष्य में जोड़ता हूं, तो समस्या दूर हो जाती है


0

जबकि इस पृष्ठ पर उत्तर ऊंचाई की बाधाओं को जोड़ने या मैन्युअल रूप से 44 की तरह रोहाइट्स को वापस करने पर चर्चा करते हुए ऊंचाई मेंForRowAtIndexPath चेतावनी को दूर जाने का कारण बनते हैं, वे बहुत कम हैं क्योंकि यह Xcode में एक बग कम से कम संस्करण 6.3.2 (6D2105) में दिखाई देता है।

यदि आप viewDidLoad में एक ब्रेकपॉइंट सेट करते हैं, तो आप देखेंगे कि self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) भले ही आप स्टोरीबोर्ड में 44 की एक पंक्ति ऊंचाई निर्दिष्ट करें। ऐसा इसलिए है क्योंकि Apple गलत तरीके से मानता है कि यदि आप 44 पर पंक्ति की ऊँचाई छोड़ते हैं, तो आप डायनामिक रो हाइट्स चाहते हैं, क्योंकि उन्होंने आपकी प्राथमिकता बताने के लिए आपको एक ध्वज प्रदान नहीं किया था।

यहां कुछ संभावित उपाय और उनके परिणाम दिए गए हैं:

  • स्टोरीबोर्ड (कार्यों) में पंक्ति की ऊंचाई 43 या 45 पर सेट करें।

  • ManForRowAtIndexPath (कार्यों) में मैन्युअल रूप से 44 की ऊंचाई पर लौटें।

  • UITableViewCell के तत्वों और इसके सामग्री दृश्य (कार्यों) के बीच ऊँचाई की कमी जोड़ें।

दुर्भाग्य से, इन समाधानों के लिए या तो आपको अपना डिज़ाइन बदलने, अनावश्यक बाधाओं को जोड़ने या बग के आसपास काम करने के लिए अनावश्यक कोड जोड़ने की आवश्यकता होती है। मैंने कोशिश की (मैंने जो सोचा था) सबसे सरल समाधान:

  • स्टोरीबोर्ड में प्रत्येक UITableViewCell की ऊंचाई 44 (कस्टम) पर सेट करें (विफल)।

मैं वास्तव में इसके लिए एक शुद्ध स्टोरीबोर्ड समाधान चाहता था, इसलिए आखिरकार मैंने कोशिश की:

  • स्टोरीबोर्ड में UITableView में एक उपयोगकर्ता-निर्धारित रनटाइम विशेषता जोड़ें, और UITableView को एक नोट के साथ नाम दें कि कैसे इसकी पंक्तिहाइट सेट की जा रही है ताकि भविष्य के डेवलपर इसे पा सकें: (कार्य):

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

ये बग आईओएस विकास में सभी सामान्य हैं और डेवलपर्स को अत्यधिक समय बिताने के लिए मजबूर करते हैं कि उनके समाधान लंबे समय में स्थिरता को कैसे प्रभावित करेंगे।

चूंकि एक वैचारिक रूप से सही समाधान मिल रहा है, जो कि रखरखाव योग्य है और ऐसा नहीं लगता है कि यह बहुत ही मायावी है, और यह मानते हुए कि Apple बग को ठीक कर देगा और यह कि 44 भविष्य के भविष्य के लिए डिफ़ॉल्ट पंक्ति ऊंचाई होने जा रहा है, तो बाधा या उपयोगकर्ता-परिभाषित रनटाइम विशेषता समाधान संभवतः सबसे अधिक रखरखाव योग्य हैं।


0

यहां दो महत्वपूर्ण बातें हो रही हैं, मुझे लगता है।

1) अगर आप ctrl + ड्रैगिंग कर रहे हैं तो बाधाओं को गलत बनाना सुपर आसान है। इसलिए, यह जांचें कि आपने इसे सही तरीके से किया है। इन बाधाओं को खींचने के लिए स्क्रीन के बाईं ओर ट्रे का उपयोग करने के लिए सबसे अच्छा है।

2) ViewDidLoad या कहीं और में अनुमानितRowHight को निर्दिष्ट करने के बजाय, प्रतिनिधि विधि का उपयोग करें

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

इसने मेरे लिए समस्या को ठीक कर दिया।


आप ओवरराइड का उपयोग क्यों कर रहे हैं?
फ्रैक्टलडॉक्टर

0

सार्वभौमिक स्टोरीबोर्ड या xibs का उपयोग करते समय मैंने यह त्रुटि भी देखी है। यदि आप किसी भी एक्स आकार वर्ग के लिए उचित बाधाओं को निर्दिष्ट करने की उपेक्षा करते हैं, तो मैंने यह त्रुटि दिखाई है।

ऐसा लगता है कि Apple ने iOS9 के लिए यह तय कर दिया है। त्रुटि केवल 8.4 पर मेरे लिए हुई।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.