尝试在表视图中添加行时出现NSInternalInconsistencyExceptionException错误

时间:2018-08-23 06:34:37

标签: ios swift uitableview

在添加行之前,我正在更新我的numberOfRowsInSection,所以它不可能是那个。我还已经在viewDidLoad()方法中设置了表的委托和数据源。我不知道还有什么可能。相关代码应该在后两种方法中。对于上下文,我试图在每次在表视图中按下按钮时添加一行。

class LiveWorkoutViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{

//MARK: Properties

@IBOutlet weak var routineNameText: UILabel!

@IBOutlet weak var exerciseTableView: UITableView!

//VARIABLES
var routine: Routine?
var setNumber = 0


override func viewDidLoad() {
    super.viewDidLoad()
    exerciseTableView.delegate = self
    exerciseTableView.dataSource = self
    routineNameText.text = routine?.name
    exerciseTableView.rowHeight = UITableViewAutomaticDimension
    exerciseTableView.estimatedRowHeight = 300
    // Do any additional setup after loading the view.
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return setNumber

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell:LiveWorkoutCell = self.exerciseTableView.dequeueReusableCell(withIdentifier: "LiveWorkoutCell") as! LiveWorkoutCell
    return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
    return (routine?.exercises.count)!
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return routine?.exercises[section].name
}

 func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 30
}

 func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 30))
    let doneButton = UIButton(frame: CGRect(x: 0, y: 0, width: 343, height: 30))
    doneButton.center = footerView.center

    doneButton.setTitle("Add Set", for: .normal)
    doneButton.setTitleColor(#colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1), for: .normal)
    doneButton.backgroundColor = UIColor(displayP3Red: 0.9176470588, green: 0.9411764706, blue: 1, alpha: 1)
    doneButton.tag = section
    doneButton.addTarget(self, action: #selector(addSet(sender:)), for: .touchUpInside)


    footerView.addSubview(doneButton)
    return footerView
}

@objc func addSet(sender: UIButton!) {
    print("Add set!")
    print(sender.tag)
    setNumber += 1

    exerciseTableView.beginUpdates()

    exerciseTableView.insertRows(at: [IndexPath(row: setNumber, section: sender.tag)], with: .automatic)

    exerciseTableView.endUpdates()
}

2 个答案:

答案 0 :(得分:0)

表中的第一行为0(即,比表中的行数少一)。

由于在调用setNumber之前要递增insertRow,所以传递的row比应该的值高1;即setNumber为1时,您需要插入第0行,但您要插入第1行。

插入行后,您可以简单地增加setNumber

@objc func addSet(sender: UIButton!) {
    print("Add set!")
    print(sender.tag)

    exerciseTableView.beginUpdates()

    exerciseTableView.insertRows(at: [IndexPath(row: setNumber, section: 0)], with: .automatic)
    setNumber += 1

    exerciseTableView.endUpdates()
}

答案 1 :(得分:0)

在@ Paulw11评论的帮助下,自己修复了该问题。

问题是我使用相同的变量表示所有节的行数,因此,当我添加一行时,它仅将其添加到一个节中,而setNumber表示所有节。解决方案是为所有部分插入行,或者使用其他方法来表示numberforRows