我的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个部分
任何人都可以帮我解决此问题吗?
答案 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()时触发。