Swift 错误:索引超出范围

Posted

技术标签:

【中文标题】Swift 错误:索引超出范围【英文标题】:Swift error: index out of range 【发布时间】:2017-09-22 09:11:31 【问题描述】:

我正在处理我的 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代码的一部分,我想我知道为什么应用程序会崩溃但我不知道如何解决这个问题,我能做什么?

【问题讨论】:

嗨,在这一行中,var users 来自哪里?users.remove(at: indexPath.row) numberOfRowsInSection 而不是return rows 返回return users.count。手动计算行数很容易出错。 @S.Wei 对!我编辑了问题 @bero vadian 的回答有帮助吗? @S.Wei no 还是不行 【参考方案1】:

根据@vadian 的评论更新您的numberOfRowsInSectionas 而不是return rows 返回return users.count。 和 用这个更新删除代码

users.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)

【讨论】:

如果我用返回用户更新返回行。计数视图加载时应用程序崩溃 是的,因为由于在 nib 中连接了委托和数据源而调用了 tablview 委托,但是您的数组“用户”没有数据。请从 nib 中删除委托和数据源连接并将它们添加到 tableView.reloadData() 之前,并在“用户”数组或数组计数> 0 中有数据时调用这些方法。

以上是关于Swift 错误:索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

Swift 致命错误:数组索引超出范围

致命错误:索引超出范围:Swift

(Swift) 致命错误:索引超出范围

Xcode Swift:致命错误:索引超出范围

swift 3.0中的索引超出范围错误

Swift TableView ImageView + Label = 致命错误:索引超出范围