用于部分问题的Swift可扩展表格视图标题

时间:2019-10-17 11:22:09

标签: ios swift xcode

我对按标题展开的表格视图有疑问。我为第零部分设置了它,并且可以正常工作,但是当我也尝试为第一部分设置相同的东西时,它也会给出错误,即

  

由于未捕获的异常“ 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!)
}

我找不到任何解决方案。我认为发件人的东西工作不正确,但这可能是另一个问题。我希望我问清楚。请帮助我。

1 个答案:

答案 0 :(得分:1)

我没有深入研究您的代码,但是我将其复制粘贴到Xcode项目中进行研究。因此,有一种基本的方法可以解决您的问题,希望对您有所帮助。

我想你的课程就是这样。

class Adres{
        var title: String = ""
        var isExpanded: Bool = true

        init(title: String, isExpanded: Bool){
            self.title = title
            self.isExpanded = isExpanded
        }
    }

其中主要有两个用于adresDictadresDictForTeslim的变量。

所以我保留了一个锁数组来做可扩展的逻辑工作。

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ç"