6

मेरे पास एक कस्टम टेबल व्यू सेल है जो ऑटो लेआउट का उपयोग करता है और एक एक्सेसरीज़ व्यूअर को एक्सेसरी व्यू के रूप में उपयोग करता है। स्क्रीन पर कोशिकाओं की कोशिका के आकार पूरी तरह से गलत हैं जब पहली दिखाया गया है:ऑटो लेआउट और एक्सेसरी व्यू के साथ कस्टम UITableViewCell

आप देख सकते हैं सेल अंतरिक्ष के एक मूल्य 1.5 स्क्रीन के बारे में ले जा रहा है के रूप में:

enter image description here

लेकिन अगर मैं बारी बारी से उपकरण और वापस बारी बारी से यह ठीक लग रहा है:

enter image description here

आप यहाँ देख सकते हैं, मैं कुछ भी नहीं किया है जटिल:

enter image description here

मैं एक बहुत ही गैर आदर्श वैकल्पिक हल करने के लिए है जो है:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView reloadData]; 
} 

लेकिन वह स्पष्ट रूप से एक 'फ्लैश' जब आप पहली बार स्क्रीन देखने का कारण बनता है। एक और जटिल परिदृश्य में फ्लैश कहीं अधिक स्पष्ट है।

मैं एक वैकल्पिक हल है, लेकिन यह एक ऑटो लेआउट अपवाद का कारण बनता है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath]; 
    cell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 
    [cell.basicLabel layoutIfNeeded]; 
    return cell; 
} 

अपवाद:

enter image description here

कम से कम इस विधि मुझे यूआई चमकती नहीं देता है।

यदि मैं एक्सेसरी व्यू को हटा देता हूं तो यह वास्तव में पूरी तरह से ठीक काम करता है।

अद्यतन: मैं GitHub के लिए एक नमूना परियोजना जोड़ दिया है: https://github.com/fwaddle/TableCellAccessoryTest

अद्यतन # 2: एक और काम से बाहर कर देता है चारों ओर इस बग कोड में सेल लेआउट है। मैंने बस कोड में एक ही चीज़ करने की कोशिश की और उसने चेतावनी फेंक दी और ठीक काम किया। एक आईबी बग की तरह लग रहा है।

कोई भी विचार इस मुद्दे के आसपास कैसे काम करना है? धन्यवाद।

+0

अपनी बाधाओं को अपने सेल के अंदर ठीक से सेट करें, जो कभी-कभी मुश्किल हो सकता है, फिर 'तालिका पंक्ति' गुण को अपने तालिका दृश्य पर 'UITableViewAutomaticDimension' पर सेट करें। यह भी एक अपवाद नहीं है, यह गलत कॉन्फ़िगरेशन के लिए एक चेतावनी है। एक बेजोड़ अपवाद आपके आवेदन को समाप्त कर देगा। – Michael

+0

हाय @ निकिता, बाधाएं ठीक से सेट की गई हैं और मैंने पंक्ति को ठीक से सेट किया है: - (शून्य) viewDidLoad { [सुपर व्यूडिडलोड]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 45; } लेकिन मैं इसके बारे में अपना मुद्दा अपवाद नहीं ले रहा हूं। – Mof

+0

मुझे लगता है कि यह आपकी बाधाओं के साथ एक मुद्दा है। अपने निर्माण को साफ करें और लेआउट में उपयोग नहीं किए जा रहे बाधाओं को हटाएं, फिर इसे बनाएं और चलाएं। – Michael

उत्तर

0

तो भी कोड में कमी कभी कभी बनाने इस समस्या को हल नहीं करता है। ऐसा लगता है कि आपको कुछ और बदलावों की आवश्यकता है।

-(void) setAccessoryType:(UITableViewCellAccessoryType)accessoryType { 
    [super setAccessoryType:accessoryType]; 
    [self setNeedsUpdateConstraints]; 
} 

इसके अलावा स्टोरीबोर्ड में प्रोटोटाइप सेल को हटा दें और अपने वर्ग रजिस्टर बजाय: अपने कस्टम तालिका सेल में निम्नलिखित खासकर यदि आप सेल (जैसे चेकमार्क) की सामग्री के आधार पर सहायक प्रकार बदल रहे हैं जोड़ें:

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    [self.tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"MyCustomCell"]; 
} 

मैं कभी कभी लगता है कि मैं अभी भी cellForRowAtIndexPath में लेआउट फिर से करने के लिए लेबल (विशेष रूप से बहु लाइन लेबल ऐसा लगता है) के लिए मजबूर करने की जरूरत है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell" forIndexPath:indexPath]; 
    cell.customLabel.text = ..... 
    [cell.customLabel layoutIfNeeded]; 
    return cell; 
} 

उपर्युक्त सभी ने मेरे मुद्दों को ठीक किया है, इसलिए मुझे उम्मीद है कि वे दूसरों के लिए उपयोग करेंगे और आप इस पर बड़ी मात्रा में बर्बाद नहीं करते हैं।

मैंने अभी भी ऐप्पल से बग रिपोर्ट के बारे में कुछ भी नहीं सुना है, लेकिन मुझे लगता है कि यह काफी सामान्य है।

3

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

- (void)tableView:(UITableView *)tableView 
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath 

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

अपने tableViewController लिए इस कोड को जोड़ें:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 

    BasicCell *basicCell = (BasicCell *)cell; 
    basicCell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 

} 
+0

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

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