UITableView: viewForHeaderInSection: पुनः लोड के दौरान नहीं बुलाया गया:


127

मैंने सही डेलीगेट और डेटासोर्स लिंकेज के साथ टेबलव्यू सेट किया है .. पुनः लोड करने की विधि डेटा स्रोत और डेलिगेट को छोड़कर कॉल करती है viewForHeaderInSection:

ऐसा क्यों हैं?


30
है heightForHeaderInSection:लागू किया?
7usam

क्या आपने TableView के लिए कोई मान निर्धारित किया है sectionHeaderHeight?
कार्टर मेडलिन

जवाबों:


256

tableView:viewForHeaderInSection:आवश्यकता है कि आप भी लागू का उपयोग करें tableView:heightForHeaderInSection:। यह शीर्ष लेख के लिए एक उपयुक्त गैर-शून्य ऊंचाई वापस करना चाहिए। यह भी सुनिश्चित करें कि आप भी लागू नहीं करते हैं tableView:titleForHeaderInSection:। आपको केवल एक या दूसरे ( viewForHeaderया titleForHeader) का उपयोग करना चाहिए ।


3
सुनिश्चित करें कि विधि के हस्ताक्षर में कोई टाइपो नहीं है। एक गलत पत्र का मतलब यह नहीं होगा। मामले की भी जांच करें। यह भी सुनिश्चित करें कि आप 0 से लौट रहे हैं numberOfSections
rmaddy

सब कुछ सही है और सही ढंग से संकलित करता है .. जिस मुद्दे को मैं समझना चाहता था, वह समय है जब विधि को बुलाया जाता है .. tableView: viewForHeaderInSection को तब बुलाया जाता है जब तालिका बस प्रदर्शित होने वाली हो और न कि समानार्थक निष्पादन के भाग के रूप में। tableview reloadData]
3

@ कामेडी ओएमजी धन्यवाद, यह मेरे लिए बहुत बेवकूफ है, मैंने अपने उदाहरण बनाए लेकिन मैंने अपने सरणी के लिए
अपील

4
आप बिल्कुल दोनों हो सकते हैं। viewForHeaderInSection: शीर्षक पर पूर्ववर्ती होगा ।ForHeaderInSection: एकमात्र आवश्यकता यह है कि आप अनुमानित तालिकाहेयरहाइट सेट करें अपनी तालिका दृश्य पर 0 से कुछ भिन्न के साथ, अन्यथा व्यूफ़ॉरहेडइनइन्फेक्शन: कभी नहीं बुलाया जाएगा
रोमियो

@ रोमरोम की टिप्पणी को जोड़ना: यदि आपने दोनों को लागू किया है titleForHeaderInSection:और viewForHeaderInSection:उत्तरार्द्ध से लौटाया गया दृश्य उप-वर्ग है UITableViewHeaderFooterViewतो इसका textLabel.textस्वचालित रूप से titleForHeaderInSection:स्ट्रिंग के ऑल-कैप संस्करण में सेट हो जाता है । इस व्यवहार को रोकने titleForHeaderInSection:के लिए, विरासत के बजाय कस्टम लेबल लागू न करें या उसका उपयोग न करें textLabel
ऑर्टविन Gentz

40

चाल यह है कि वे दो विधियां अलग-अलग UITableViewप्रोटोकॉल से संबंधित हैं : tableView:titleForHeaderInSection:एक UITableViewDataSourceप्रोटोकॉल विधि है, जहां से tableView:viewForHeaderInSectionसंबंधित है UITableViewDelegate

इसका मत:

  • यदि आप विधियों को लागू करते हैं, लेकिन केवल अपने लिए ही असाइन dataSourceकरते हैं UITableView, तो आपके tableView:viewForHeaderInSectionकार्यान्वयन को नजरअंदाज कर दिया जाएगा।

  • tableView:viewForHeaderInSectionएक उच्च प्राथमिकता है। आप तरीकों में से दोनों को लागू करने और दोनों के रूप में अपने आप को असाइन करते हैं dataSourceऔर delegateके लिए UITableView, आप के लिए खंड हेडर विचारों वापस आ जाएगी, लेकिन अपने tableView:titleForHeaderInSection:नजरअंदाज कर दिया जाएगा।

मैंने हटाने की कोशिश भी की है tableView:heightForHeaderInSection:; यह ठीक काम किया और ऊपर की प्रक्रियाओं को प्रभावित नहीं किया। लेकिन दस्तावेज़ीकरण कहता है कि tableView:viewForHeaderInSectionसही ढंग से काम करने के लिए यह आवश्यक है; इसलिए यह सुरक्षित है कि इसे लागू करना बुद्धिमानी है।


6
आपने मेरा दिन बना दिया!!! आवंटित करने के लिए भूल UITableViewDelegateकरने के लिए self, क्योंकि मैंने सोचा, कि tableView:viewForHeaderInSectionएक है UITableViewDataSourceविधि। धन्यवाद!
डेनिस 631

1
"tableView: viewForHeaderInSection" महत्वपूर्ण नहीं है। क्या महत्वपूर्ण है आप किसी भी तरह एक ऊंचाई वापस आ रहे हैं। आप इसे 1. अनुमान या 2. एक हार्डकोड मान या 3. के माध्यम से प्राप्त कर सकते हैं, titleForHeaderजिसमें एक आंतरिक आकार है। आंतरिक आकार की गणना फ़ॉन्ट परिवार और आकार के आधार पर की जाती है।
हनी

28

@rmaddy नियम, दो बार misstated है: वास्तव में, tableView:viewForHeaderInSection:करता नहीं की आवश्यकता होती है कि आप भी लागू tableView:heightForHeaderInSection:, और यह भी यह दोनों फोन करने के लिए बिल्कुल ठीक है titleForHeaderऔर viewForHeader। मैं केवल रिकॉर्ड के लिए सही ढंग से नियम बताऊंगा:

नियम केवल यह है कि viewForHeaderजब तक आप किसी तरह हेडर को ऊंचाई नहीं देते हैं, तब तक इसे नहीं बुलाया जाएगा। आप इसे तीन तरीकों से किसी भी संयोजन में कर सकते हैं:

  • लागू करें tableView:heightForHeaderInSection:

  • तालिका सेट करें sectionHeaderHeight

  • कॉल titleForHeader(यह किसी भी तरह हेडर को डिफ़ॉल्ट ऊंचाई देता है यदि यह अन्यथा नहीं है)।

यदि आप उन चीजों में से कोई भी नहीं करते हैं, तो आपके पास कोई हेडर viewForHeaderनहीं होगा और आपको बुलाया नहीं जाएगा। ऐसा इसलिए है क्योंकि ऊंचाई के बिना, रनटाइम को पता नहीं चलेगा कि दृश्य का आकार कैसे बदलना है, इसलिए यह एक के लिए पूछने के लिए परेशान नहीं करता है।


डॉक्स के लिए tableView:viewForHeaderInSection:: "यह विधि केवल तभी सही ढंग से काम करती है जब tableView:heightForHeaderInSection:इसे लागू किया जाता है।"
rammdy

1
ठीक। डॉक्स क्या कहते हैं, वे कहते हैं। अब प्रयोग करो। तथ्य वैसे हैं जैसे मैंने कहा है।
मैट

और आप दोनों कैसे हो सकते हैं titleForHeaderInSectionऔर viewForHeaderInSection? तालिका दृश्य केवल दो में से एक को कॉल करेगा (मैं भूल जाता हूं जो इस समय पूर्वता प्राप्त करता है)।
rammdy

1
वास्तव में पहेली का एक और टुकड़ा है, जो यह है कि कभी-कभी ऊंचाई को निर्दिष्ट करने के उन तीन तरीकों में से किसी के बिनाviewForHeader कहा जाता है । मैंने ऐसा किया है, जहां मुझे बुलाया गया था और हेडर ने ठीक दिखाया, एक दिन तक, मेरी तरफ से कोई बदलाव नहीं हुआ, उन्होंने नहीं किया । कि जब मैंने यह पता लगाने के लिए प्रयोग करना शुरू किया कि न्यूनतम आवश्यकताओं को क्या कहा जाता है। और अब मुझे पता है। और अब तो तुम करते हो viewForHeaderviewForHeader
मैट

2
@ लता नहीं, मैं ज़ामरीन नहीं। कोको फ्रेमवर्क के शीर्ष पर अप्रत्यक्ष के एक और स्तर को जोड़ने से मेरा सिर फट जाएगा। :)
मैट

20

देने estimatedSectionHeaderHeightऔर sectionHeaderHeightमूल्यों ने मेरी समस्या तय कर दी। जैसे, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension


मेरी समस्या 3.1 स्विफ्ट में अपग्रेड करने के बाद शुरू हुई। इस समाधान ने इसे ठीक कर दिया।
zevij

@pbuchheit एप्पल डॉक्स कहते हैं कि यह iOS 7.0+ से उपलब्ध है, तो कृपया एक नज़र यहाँ, है developer.apple.com/documentation/uikit/uitableview/...
Sharukh मस्तान

@ शारुख मस्तान लगता है कि आप सही हैं। किसी कारण से मुझे उस संपत्ति का उपयोग करने की कोशिश करने पर चेतावनी मिल रही थी, लेकिन एक साफ निर्माण करने के बाद यह चला गया।
pbuchheit

7

असभ्य जवाब से दूर जा रहा है, मैं हेडर दृश्य को छिपाने की कोशिश कर रहा था और "tableView: heightForHeaderInSection" के लिए 0.0f लौट रहा था और एक 0 ऊँचाई से देख रहा था tableView:viewForHeaderInSection

से बदलने के बाद return 1.0fकरने के लिए return 0.0fमें tableView:heightForHeaderInSection, प्रतिनिधि विधि tableView:viewForHeaderInSectionवास्तव में बुलाया गया था।

"TableView: heightForHeaderInSection" का उपयोग किए बिना मेरा वांछित प्रभाव काम करता है; लेकिन यह उन लोगों के लिए उपयोगी हो सकता है जिनके पास "tableView: heightForHeaderInSection" डेलिगेट विधि नामक एक समस्या हो रही है।


5

आपको tableView:heightForHeaderInSection:शीर्ष लेख> 0 के लिए ऊंचाई को लागू करना और सेट करना चाहिए ।

यह प्रतिनिधि विधि विधि के साथ जाती है viewForHeaderInSection:

आशा है कि ये आपकी मदद करेगा।

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
         return 40;
}

क्या आपने परीक्षण किया है कि आपका उत्तर वास्तव में काम करता है? जब आप ईफ को ध्यान से पढ़ते हैं, तो यह कहा जाता है कि शुरू में व्यूफेयरइन्डरइन को कहा जाता है। यह केवल तब नहीं कहा जाता है जब तालिका पुनः लोड की जाती है!
कार्लिस

5

यह संक्षेप में ध्यान देने योग्य है कि यदि आपके tableView:heightForHeaderInSection:रिटर्न का कार्यान्वयन UITableViewAutomaticDimension, तो tableView:viewForHeaderInSection:नहीं कहा जाएगा।

UITableViewAutomaticDimensionमानता है कि एक मानक UITableViewHeaderFooterViewका उपयोग किया जाएगा जो प्रतिनिधि विधि के साथ आबादी है tableView:titleForHeaderInSection:

में टिप्पणियों से UITableView.h:

इस मान से tableView:heightForHeaderInSection:या tableView:heightForFooterInSection:उस ऊँचाई पर लौटना जो मान से लौटाए गए मान पर फिट बैठता है tableView:titleForHeaderInSection:या tableView:titleForFooterInSection:यदि शीर्षक शून्य नहीं है।


1
यदि आप estimatedSectionHeaderHeightकुछ मूल्य पर सेट होते हैं, tableView:viewForHeaderInSectionतो कहा जाएगा (इसी तरह से पंक्तियों के लिए ऑटो आयाम कैसे काम करता है)
GreatWiz

दिलचस्प है, धन्यवाद। 7.1 पर वापस अनुमानित ऊंचाई की यह सूक्ष्मता कोशिकाओं के लिए महत्वपूर्ण थी , इसलिए हेडर के लिए भी मामला हो सकता है - लेकिन यह अब बहुत प्रासंगिक नहीं है!
बेंजो

3

मैं सिर्फ हेडर के साथ एक समस्या आईओएस 7.1 के लिए नहीं दिखा रहा हूं, लेकिन बाद में रिलीज के साथ ठीक काम कर रहा हूं, स्पष्ट रूप से 8.1 और 8.4 के साथ।

ठीक उसी कोड के लिए, 7.1 किसी भी सेक्शन हेडर के प्रतिनिधि के तरीकों को बिल्कुल नहीं बुला रहा था , जिसमें शामिल हैं: tableView:heightForHeaderInSection:और tableView:viewForHeaderInSection:

प्रयोग के बाद, मैंने पाया कि मेरे बनाए हेडर से इस लाइन को हटाने से viewDidLoad7.1 के लिए फिर से दिखाई देता है और मैंने परीक्षण किए गए अन्य संस्करणों को प्रभावित नहीं किया है:

// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;

... तो, वहाँ 7.1 के लिए किसी तरह का संघर्ष लगता है, कम से कम।


3

एक ही समस्या मेरे साथ हुई, लेकिन जैसा कि मैं xCode 9 से स्वचालित ऊंचाई गणना का उपयोग कर रहा था , मैं ऊपर बताए अनुसार कोई स्पष्ट ऊंचाई मान नहीं दे सकता। कुछ प्रयोग के बाद मुझे समाधान मिला , हमें इस विधि को ओवरराइड करना होगा,

-(CGFloat)tableView:(UITableView *)tableView 
         estimatedHeightForHeaderInSection:(NSInteger)section
{
      return 44.0f;
}

हालांकि मैंने दोनों विकल्पों की जाँच की है

  1. स्वचालित ऊँचाई गणना
  2. स्वचालित अनुमानित ऊँचाई गणना

से स्टोरीबोर्ड सेब कहते हैं, लेकिन अभी भी मैं इस अजीब त्रुटि मिली है।

कृपया ध्यान दें : यह त्रुटि केवल IOS-10 संस्करण पर दिखाई गई थी IOS-11 संस्करण पर नहीं । शायद यह xCode से बग है। धन्यवाद


0

यहाँ मैंने क्या पाया है ( स्विफ्ट 4 ) ( इस सवाल के लिए एक टिप्पणी पर धन्यवाद )

क्या मैंने titleForHeaderInSection या viewForHeaderInSection का उपयोग किया है - यह नहीं था कि टेबलव्यू स्क्रॉल किए जाने पर उन्हें बुलाया नहीं जा रहा था और नई कोशिकाओं को लोड किया जा रहा था, लेकिन हेडर व्यू के टेक्स्टलेबेल के लिए मेरे द्वारा किए गए कोई भी फ़ॉन्ट केवल लोड पर शुरू में दिखाई दे रहे थे। , और नहीं के रूप में तालिका स्क्रॉल किया गया था।

यह फिक्स था ।DisplayHeaderView:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel?.font = UIFont(name: yourFont, size: 42)
    }
}

0

मेरे मामले में मैंने इस तरह UITableviewCellसे सेल का उपयोग करके और वापस लौटकर हेडर व्यू बनाया हैviewForHeaderInSection

return cell

इसे बदल दिया गया

return cell.contentView 

मेरे लिए काम किया।


0

मेरे मामले में

viewForHeaderInSection

दूर के एक व्युत्पन्न वर्ग में लागू किया गया था जो सुपरक्लास में डेज़ी करने के लिए परेशान नहीं था।


0

viewForHeaderInSectionदो कारणों में से एक को क्यों नहीं बुलाया जाता है:

या तो आपने अपना सेट अप नहीं किया UITableViewDelegate, या आपने अपना UITableViewDelegateगलत तरीके से सेट किया ।


0

मेरे मामले में यह कारण था कि मैंने लागू नहीं किया:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

-1

कभी कभी की स्थापना tableview.delegateया datasource = nilमें viewWillAppear:या viewDidAppear:तरीकों इस मुद्दे का कारण बन सकती। सुनिश्चित करें कि ऐसा न करें ...


-1

मैंने अपनी स्विफ्ट 3 परियोजना में एक स्विफ्ट 2 परियोजना से निम्नलिखित दो विधियों को काटा और पेस्ट किया था, जिन्हें कभी नहीं बुलाया गया था क्योंकि स्विफ्ट 3 में इन विधियों का पहला पैरामीटर नाम से पहले "-" होना चाहिए।

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 44.0
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView        
    return headerView
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.