সংযোগযোগ্য বিভাগ: [দৃsert়তা] প্রি-রিয়েলড ফার্স্টভিজিবলরো (0) এর জন্য নতুন গ্লোবাল সারি সূচক নির্ধারণ করতে অক্ষম


9

আমি একটি ইউআইটিএবলভিউকন্ট্রোলারে সংযোগযোগ্য বিভাগের শিরোনামগুলি প্রয়োগ করছি।

এখানে প্রতি বিভাগে কত সারি দেখানো হবে তা আমি নির্ধারণ করছি:

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()
}

সবকিছুই কাজ করছে এবং দুর্দান্তভাবে অ্যানিমেট করছে, তবে একটি প্রসারিত বিভাগটি সঙ্কুচিত করার সময় কনসোলে, আমি এই [দৃsert়তা] পেয়েছি:

[দৃsert়তা] প্রাক রিয়েলড ফার্স্টভিজিবলরো (0) এর জন্য নতুন গ্লোবাল সারি সূচক নির্ধারণ করতে অক্ষম

এটি একই খোলার অংশটি বন্ধ হয়ে যাওয়া (ধসে পড়া), বা আমি অন্য বিভাগটি খুলছি এবং পূর্বে খোলা বিভাগটি 'স্বয়ংক্রিয়ভাবে বন্ধ' করছি কিনা তা বিবেচনা না করেই এটি ঘটে।

আমি ডেটা দিয়ে কিছু করছি না; এটা অবিরাম।

কেউ কি অনুপস্থিত তা ব্যাখ্যা করতে সহায়তা করতে পারে? ধন্যবাদ


আপনার টেবিলভিউটি কি অনেকগুলি বিভাগের সমন্বয়ে গঠিত এবং অনেকগুলি আসল সারি নেই?
বায়রন কোটসি

আপনি কি কখনও এটি ঠিক করতে পরিচালনা করেছেন?
পলডোসদেভ

@ বায়রনকয়েটস হ্যাঁ, যতক্ষণ না একটি বিভাগ প্রসারিত হয়। সুতরাং যখন সমস্ত ধসে পড়ে তখন এটি কেবল বিভাগের শিরোনাম। যখন কোনওটি প্রসারিত হয় তখন এটি অবিস্তৃত বিভাগগুলির জন্য সমস্ত বিভাগের শিরোনাম এবং কোনও বিভাগ শিরোনাম এবং তারপরে ডেটাগুলির জন্য সেল হয়।
iOSProgrammingIsFun

@ পোলডোসডেভ আমি করেছি, তবে এই প্রক্রিয়াটি ব্যবহার করে নয়। আমি এটি সম্পূর্ণরূপে পুনর্লিখন করেছি যাতে এটি একই প্রদর্শিত হয়, এটি সম্পূর্ণ আলাদাভাবে কাজ করে। যাইহোক আমি এটিকে এখানে রেখে যাচ্ছি যদি কেউ সুন্দরভাবে এটি ঠিক করতে পারে, বা এটি অন্যকে কোনওভাবে সহায়তা করে।
iOSProgrammingIsFun

1
@iOSProgrammingIsFun হাহ হ্যাঁ আমি ভেবেছিলাম এটি হ্যাকের মতো অনুভূত হতে পারে এবং এটি প্রযুক্তিগতভাবেই রয়েছে তবে কোডের পরিমাণ এবং এটি সত্য যে খুব পরিষ্কার এটি আমি রাতে ঘুমাতে পারি: পি কোড নীচে পোস্ট করা হয়েছে
বায়রন কোটসি

উত্তর:


8

টেবিলভিউটি সারিগুলি পুনরায় লোড করার সময় এটি কোথায় ছিল তা জানতে, এটি একটি "অ্যাঙ্কর সারি" সন্ধান করার চেষ্টা করে যা এটি একটি রেফারেন্স হিসাবে ব্যবহার করে। একে বলা হয় অ preReloadFirstVisibleRow। যেহেতু সমস্ত বিভাগটি ধসে পড়েছে এই টেবিলভিউতে কোনও পর্যায়ে কোনও দৃশ্যমান সারি নাও থাকতে পারে, টেবিলভিউটি কোনও অ্যাঙ্কর খুঁজে না পাওয়ায় বিভ্রান্ত হয়ে পড়বে। এটি তারপরে পুনরায় সেট করবে।

সমাধান: ধসে পড়েছে এমন প্রতিটি গ্রুপে একটি 0 উচ্চতার সারি যুক্ত করুন। এইভাবে, কোনও অংশটি ধসে গেলেও, এখনও একটি সারি উপস্থিত রয়েছে (0 পিক্সেল উচ্চতার হলেও)। টেবিলভিউ এরপরে সর্বদা রেফারেন্স হিসাবে কিছু কিছু থাকে। আপনি যদি সারি numberOfRowsInSectionগণনা 0 হয় তবে একটি সারি যুক্ত indexPath.rowকরে এবং ফ্যাটম সেল মান 0 এর পূর্বে indexPath.rowপ্রয়োজন হয় তার আগে ফ্যাটম সেল মানটি ফিরিয়ে দেওয়ার বিষয়ে নিশ্চিত হয়ে আরও কলগুলি পরিচালনা করে আপনি এটি কার্যকরভাবে datasource.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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.