Swift错误:索引超出范围

时间:2017-09-22 09:11:31

标签: ios swift xcode uitableview swift3

我正在使用我的tableView,刚才我实现了删除行的功能,但在我删除一行后,应用程序崩溃并出现此错误(致命错误:索引超出范围)

struct User {

        var name: String
        var images: UIImage
        var coordinate : (Double , Double)
        var type: String
        var address: String
    }


      var users = [User]()




override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            rows = 0
            tableView.reloadData()
            insertRowsMode3()
    }

        @IBAction func refreshTapped(_ sender: Any) {

            rows = 0
            tableView.reloadData()
            insertRowsMode3()
        }

        func insertRowsMode2() {

            for i in 0..<users.count {
                insertRowMode2(ind: i, usr: users[i])
            }            
        }

        func insertRowMode2(ind:Int,usr:User) {

            let indPath = IndexPath(row: ind, section: 0)

            rows = ind + 1
          tableView.insertRows(at: [indPath], with: .right)
        }        

        func insertRowsMode3() {

            rows = 0            
            insertRowMode3(ind: 0)
        }

        func insertRowMode3(ind:Int) {

            let indPath = IndexPath(row: ind, section: 0)                        
            rows = ind + 1                       
            tableView.insertRows(at: [indPath], with: .right)                        

            guard ind < users.count-1 else { return }
            DispatchQueue.main.asyncAfter(deadline: .now()+0.20) {                
                self.insertRowMode3(ind: ind+1)
            }
        }

        func numberOfSections(in tableView: UITableView) -> Int {           
            return 1
        }        

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

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

            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell

            let user = users[indexPath.row]

            cell.selectionStyle = .none

            cell.myImage.image = user.images
            cell.myLabel.text = user.name
            cell.myTypeLabel.text = user.type
            return (cell)
        }

         func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            tableView.deselectRow(at: indexPath, animated: true)

            UIView.animate(withDuration: 0.2, animations: {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
            })

            performSegue(withIdentifier: "goToLast" , sender: users[indexPath.row])

        }

         func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return 100
        }

        func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
            return true
        }

        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

            if editingStyle == UITableViewCellEditingStyle.delete {

                users.remove(at: indexPath.row)
                tableView.reloadData()

            }           
        }

这是我的tableView代码的一部分,我想我知道为什么应用程序崩溃但我不知道如何解决这个问题,我能做什么?

1 个答案:

答案 0 :(得分:0)

根据@ vadian的评论更新您的numberOfRowsInSectionas而不是return rows返回return users.count。 和     使用此

更新删除代码
users.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)