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 错误:索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章