我对按标题展开的表格视图有疑问。我为第零部分设置了它,并且可以正常工作,但是当我也尝试为第一部分设置相同的东西时,它也会给出错误,即
由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“无效的更新:第0节中的行数无效。更新(0)后现有节中包含的行数必须等于行数更新(2)之前包含在该部分中的内容,加上或减去从该部分插入或删除的行数(已插入0,已删除0),以及加上或减去移入或移出该部分的行数(移入0 ,0移出)。
如果我没有触发第二个标头功能,则第一个标头仍在工作。当我单击第二个标题(这是第一部分)时,出现该错误。
这是我的标题视图代码:
.as-console-wrapper { max-height: 100% !important; top: 0; }
这是我的动作功能:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 {
let button = UIButton(type: .system)
button.setTitle("Kapat", for: .normal)
button.setTitleColor(.black, for: .normal)
button.backgroundColor = .lightGray
button.titleLabel!.font = UIFont.boldSystemFont(ofSize: 14)
button.addTarget(self, action: #selector(handleExpandCloseForAlim(sender:)), for: .touchUpInside)
return button
}
if section == 1 {
let button2 = UIButton(type: .system)
button2.setTitle("Kapat", for: .normal)
button2.setTitleColor(.black, for: .normal)
button2.backgroundColor = .lightGray
button2.titleLabel!.font = UIFont.boldSystemFont(ofSize: 14)
button2.addTarget(self, action: #selector(handleExpandCloseForTeslim(sender:)), for: .touchUpInside)
return button2
}
else{
return nil
}
}
这是我的numberOfRowsInSection部分:
@objc func handleExpandCloseForAlim(sender: UIButton) {
var indexPaths = [IndexPath]()
for row in self.userAdressDict.indices{
let indexPath = IndexPath(row: row, section: 0)
indexPaths.append(indexPath)
}
let indexPath = IndexPath(row: (sender.tag), section: 0)
let adresso = self.userAdressDict[indexPath.row]
let isExp = adresso.isExpanded
adresso.isExpanded = !isExp!
if isExp! {
tableView.deleteRows(at: indexPaths, with: .fade)
}else {
tableView.insertRows(at: indexPaths, with: .fade)
}
print(adresso.isExpanded!, adresso.userMahalle!)
}
@objc func handleExpandCloseForTeslim(sender: UIButton) {
var indexPathsForTeslim = [IndexPath]()
for row in self.userAdressDictForTeslim.indices{
let indexPath = IndexPath(row: row, section: 1)
indexPathsForTeslim.append(indexPath)
}
let indexPath = IndexPath(row: (sender.tag), section: 1)
let adresso = self.userAdressDictForTeslim[indexPath.row]
let isExp = adresso.isExpanded
adresso.isExpanded = !isExp!
if isExp! {
tableView.deleteRows(at: indexPathsForTeslim, with: .fade)
}else {
tableView.insertRows(at: indexPathsForTeslim, with: .fade)
}
print(adresso.isExpanded!, adresso.userMahalle!)
}
我找不到任何解决方案。我认为发件人的东西工作不正确,但这可能是另一个问题。我希望我问清楚。请帮助我。
答案 0 :(得分:1)
我没有深入研究您的代码,但是我将其复制粘贴到Xcode项目中进行研究。因此,有一种基本的方法可以解决您的问题,希望对您有所帮助。
我想你的课程就是这样。
class Adres{
var title: String = ""
var isExpanded: Bool = true
init(title: String, isExpanded: Bool){
self.title = title
self.isExpanded = isExpanded
}
}
其中主要有两个用于adresDict
和adresDictForTeslim
的变量。
所以我保留了一个锁数组来做可扩展的逻辑工作。
var keys: [Int] = [1,1]
<1> Show
<0> Hide
现在,数组元素显示在UITableView中,因为它已展开。
有模拟数据。
var userAdressDict = [Adres(title: "First Adres", isExpanded: true) ,Adres(title: "Second Adres", isExpanded: true)]
var userAdressDictForTeslim = [Adres(title: "First Teslim", isExpanded: true),Adres(title: "Second Teslim", isExpanded: true)]
viewForHeaderInSection
也一样。
对于numberOfRowsInSection
,请检查数组是否包含键是否扩展的键。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
if self.keys[0] == 1 {
return userAdressDict.count
}else{
return 0
}
}else{
if self.keys[1] == 1 {
return userAdressDictForTeslim.count
}else{
return 0
}
}
}
然后在处理程序功能中检查这些键。
@objc func handleExpandCloseForAlim(sender: UIButton) {
if keys[0] == 0 {
keys[0] = 1
}else{
keys[0] = 0
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
如果表格视图中的第一个数组元素被展开,则将其关闭或不展开。
然后使用另一个功能。
@objc func handleExpandCloseForTeslim(sender: UIButton) {
if keys[1] == 0 {
keys[1] = 1
}else{
keys[1] = 0
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
到目前为止,一切都很好。它正在我的模拟器上运行。
然后,有一种更有效的方法来处理扩展键。
将sectionHeader的UIButton's
作为ViewController
中的公共变量,并对其进行控制(如果标题为"Kapat"
并单击,则必须为"Aç"
或{ {1}},并感动它必须为"Aç"
。