बंधनेवाला अनुभाग: [मुखर] PreReloadFirstVoubleRow (0) के लिए नए वैश्विक पंक्ति सूचकांक का निर्धारण करने में असमर्थ


9

मैं एक UITableViewController में बंधनेवाला अनुभाग हेडर लागू कर रहा हूँ।

यहां बताया गया है कि मैं निर्धारित करता हूं कि प्रति अनुभाग कितनी पंक्तियों को दिखाना है:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return self.sections[section].isCollapsed ? 0 : self.sections[section].items.count
}

एक संरचना है जो अनुभाग की जानकारी को 'कैलेप्सड' के लिए बूल के साथ रखती है।

यहां बताया गया है कि मैं उनके राज्यों में कैसे पहुंच रहा हूं:

private func getSectionsNeedReload(_ section: Int) -> [Int]
{
    var sectionsToReload: [Int] = [section]

    let toggleSelectedSection = !sections[section].isCollapsed

    // Toggle collapse
    self.sections[section].isCollapsed = toggleSelectedSection

    if self.previouslyOpenSection != -1 && section != self.previouslyOpenSection
    {
        self.sections[self.previouslyOpenSection].isCollapsed = !self.sections[self.previouslyOpenSection].isCollapsed
        sectionsToReload.append(self.previouslyOpenSection)
        self.previouslyOpenSection = section
    }
    else if section == self.previouslyOpenSection
    {
        self.previouslyOpenSection = -1
    }
    else
    {
        self.previouslyOpenSection = section
    }

    return sectionsToReload
}



internal func toggleSection(_ header: CollapsibleTableViewHeader, section: Int)
{
    let sectionsNeedReload = getSectionsNeedReload(section)

    self.tableView.beginUpdates()
    self.tableView.reloadSections(IndexSet(sectionsNeedReload), with: .automatic)
    self.tableView.endUpdates()
}

सबकुछ काम कर रहा है और अच्छी तरह से एनिमेट कर रहा है, हालांकि कंसोल में जब एक विस्तारित खंड को ढहाया जाता है, तो मुझे यह मिलता है [मुखर]:

[जोर दें] PreReloadFirstVanishRow (0) के लिए नए वैश्विक पंक्ति सूचकांक का निर्धारण करने में असमर्थ

ऐसा होता है, भले ही यह एक ही खोला खंड, समापन (ढहने) हो, या यदि मैं एक और खंड खोल रहा हूं और पहले से खुले खंड को 'ऑटो-क्लोजिंग' कर रहा हूं।

मैं डेटा के साथ कुछ नहीं कर रहा हूँ; यह लगातार है।

किसी को समझाने में मदद कर सकता है क्या याद आ रही है? धन्यवाद


क्या आपका टेबलव्यू वर्गों के एक समूह से बना है और कई वास्तविक पंक्तियों में नहीं है?
बायरन कोएट्सी

क्या आपने कभी इसे ठीक करने का प्रबंधन किया?
पॉलडोसडेव

@ByronCoetsee हाँ, जब तक कि एक खंड का विस्तार नहीं किया जाता है। इसलिए जब सभी ढह गए तो यह सिर्फ हेड हेडर है। जब एक का विस्तार किया जाता है तो यह गैर-विस्तारित अनुभागों के लिए सभी अनुभाग हेडर और एक अनुभाग हेडर और फिर डेटा के लिए सेल होता है।
iOSProgrammingIsFun

@PaDDoesDev मैंने किया, लेकिन इस तंत्र का उपयोग करके नहीं। मैंने इसे पूरी तरह से फिर से लिखा है ताकि जब यह समान दिखाई दे, तो यह पूरी तरह से अलग तरह से काम करता है। हालाँकि मैं इसे यहाँ छोड़ने जा रहा हूँ अगर कोई व्यक्ति इसे ठीक कर सकता है, या यह किसी तरह से दूसरों की मदद करता है।
iOSProgrammingIsFun

1
@iOSProgrammingIsFun haha ​​हाँ, मैंने सोचा था कि यह एक हैक की तरह महसूस कर सकता है और यह तकनीकी रूप से है, लेकिन कोड की मात्रा और तथ्य यह है कि यह वास्तव में बहुत साफ है इसका मतलब है कि मैं रात में खुद को सो सकता हूं: पी कोड नीचे पोस्ट किया गया है
क्रोन कॉएटसी

जवाबों:


8

तालिका दृश्य के लिए यह जानने के लिए कि यह पंक्तियों आदि को फिर से लोड करने के दौरान कहाँ है, यह एक "लंगर पंक्ति" खोजने की कोशिश करता है जिसे यह एक संदर्भ के रूप में उपयोग करता है। इसे ए कहते हैं preReloadFirstVisibleRow। चूँकि इस तालिका दृश्य में किसी बिंदु पर कोई दृश्य पंक्तियाँ नहीं हो सकती हैं क्योंकि सभी खंडों के ढह जाने के कारण, तालिका दृश्य भ्रमित हो जाएगा क्योंकि यह एक लंगर नहीं ढूँढ सकता है। यह फिर शीर्ष पर रीसेट हो जाएगा।

समाधान: हर समूह में एक 0 ऊँचाई पंक्ति जोड़ें जो ढह गया है। इस तरह, भले ही एक खंड ढह गया हो, फिर भी एक पंक्ति मौजूद है (0px ऊंचाई के बावजूद)। TableView में हमेशा संदर्भ के रूप में हुक करने के लिए कुछ होता है। numberOfRowsInSectionयदि पंक्ति पंक्ति 0 है और पंक्ति 0 है, तो आवश्यक है indexPath.rowइससे पहले कि फ़ाटोम सेल मान वापस करने के लिए सुनिश्चित करके किसी भी आगे की कॉल को हैंडल करने पर आप इसे एक पंक्ति के जोड़ से प्रभाव में देखेंगे ।indexPath.rowdatasource.visibleRows

कोड में डेमो करना आसान है:

func numberOfSections(in tableView: UITableView) -> Int {
    return datasource.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return datasource[section].visibleRows.count == 0 ? 1 : datasource[section].visibleRows.count
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    datasource[section].section = section
    return datasource[section]
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if datasource[indexPath.section].visibleRows.count == 0 { return 0 }
    return datasource[indexPath.section].visibleRows[indexPath.row].bounds.height
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if datasource[indexPath.section].visibleRows.count == 0 { return UITableViewCell() }

    // I've left this stuff here to show the real contents of a cell - note how
    // the phantom cell was returned before this point.

    let section = datasource[indexPath.section]
    let cell = TTSContentCell(withView: section.visibleRows[indexPath.row])
    cell.accessibilityLabel = "cell_\(indexPath.section)_\(indexPath.row)"
    cell.accessibilityIdentifier = "cell_\(indexPath.section)_\(indexPath.row)"
    cell.showsReorderControl = true
    return cell
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.