尝试插入第3部分,但更新后只有3个部分

时间:2018-01-05 08:51:46

标签: ios swift uitableview reloaddata

我的Tableview有N个节,其中0,1个节被修复。永远不会从tableview中删除。但是从第2节开始到N个部分,可以删除或插入。从第2部分到N部分 - >每个部分也有行数。

我在第2部分搜索N个部分的功能。
这是整个代码
1。这是计数dic,其中包含每个部分的行数[“section”:“no of rows”]

self.countDic.updateValue(1, forKey: "0")
self.countDic.updateValue(0, forKey: "1")
for i in 0..<arra1.count {
    self.countDic.updateValue(array.count, forKey: "\(i + 2)")//[index : arraylist.count]
}


2。以下是返回部分和行的Tableview方法

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return countDic["\(section)"]!
}
func numberOfSections(in tableView: UITableView) -> Int {
    return countDic.count
}


第3。这是搜索和表格重新加载代码

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)

    if (newString.isEmpty) {
        FilterStr = ""
    } else {
        FilterStr = newString
    }

    let namesBeginningWithLetterPredicate = NSPredicate(format: "(title1 CONTAINS[cd] $letter)")

    let arr : [Today_ActivityModel] = (Today_Activity_Data as NSArray).filtered(using: namesBeginningWithLetterPredicate.withSubstitutionVariables(["letter": FilterStr])) as! [Today_ActivityModel]
    if FilterStr == "" {
        self.countDic.removeAll()

        FilterData.removeAll()
        //self.GetRecordsCityWiseFilter(ArrayList: self.Today_Activity_Data)
    } else {
        if arr.count >= 0 {

            FilterData.removeAll()
            //self.GetRecordsCityWiseFilter(ArrayList: arr )
        } else {

            self.countDic.removeAll()

            FilterData.removeAll()
            //self.GetRecordsCityWiseFilter(ArrayList: self.Today_Activity_Data)
        }
    }
    DispatchQueue.main.async {
        UIView.performWithoutAnimation {

            let indexSet = IndexSet(integersIn: 2..<self.TblView.numberOfSections)
            self.TblView.reloadSections(indexSet, with: .bottom)
        }
    }
    return true
}

重新加载表格时,尝试插入第3部分,但更新后只有3个部分
任何人都可以帮我解决此问题吗?

2 个答案:

答案 0 :(得分:0)

首先直到UITableView缓存了部分数量的细节,所以在你实际重新加载UITableView之前,numberOfSections仍会产生旧值。

例如,如果你有一个这样的剖面数组:

var sections: [Int] = [2, 1]

和这个方法:

func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
}

用于提供节中的行数,然后执行此操作:

sections.append(5)
print (tableView.numberOfSections)
tableView.reloadData()
print (tableView.numberOfSections)

您将获得结果2和3,因为在表格视图重新加载数据之前,numberOfSections不会更新。

其次,由于工作方式的原因,您只能重新加载已经存在的部分而不是新添加的部分。相反,你必须计算出被添加/删除的部分,而是使用insertSections和deleteSections方法。

第三,为什么不使用:

self.TblView.reloadData()

让你们全部为你处理。

答案 1 :(得分:0)

有两种方法可以重新加载数据。首先 - 调用重新加载数据。它将刷新整个表视图,并从DataSource请求加载数据。

第二步:手动添加数据,触发数据源必要部分的加载。

所以基本上如果你不想重新加载所有表格,或者想拥有漂亮的动画,你需要先添加新的部分。

TblView.insertSections(IndexSet(integer: 1), with: .left)

请注意,您必须先更改数据,然后让表视图查询新部分的数据。它将自动从数据源加载数据。

请在以下网址查看其他详细信息:https://developer.apple.com/documentation/uikit/uitableview/1614892-insertsections

编辑:我注意到您正在尝试在UIView.animation中重新加载表格。它不会那样工作。当您告诉表格视图添加/删除/更新其中的数据时,您可以指定所需的动画,或者它.none

更新: 代码示例:

tableView.beginUpdates()
let toUpdateIndexSet = IndexSet(integersIn: 1 ..< tableView.numberOfSections)
tableView.reloadSections(toUpdateIndexSet, with: .fade)

if tableView.numberOfSections < self.numberOfSections(in: tableView) {
    let toAddIndexSet = IndexSet(integersIn: tableView.numberOfSections ..< self.numberOfSections(in: tableView))
    tableView.insertSections(toAddIndexSet, with: .right)
}
tableView.endUpdates()

请注意,在进行更改时,表视图会尝试从数据源重新加载内容。但是,如果您在更新之前有1个部分,而不是在第一部分添加第二部分和几行,并且将尝试重新加载第一部分,则会发生崩溃(数据源有两个部分,但表视图此时只有一个部分)。 因此,在这种情况下,您需要进行批量更新 - beginUpdates ,插入新行并添加新部分 endUpdates 。 在这种情况下,数据源将仅在endUpdates()时触发。