当我在真实设备中频繁推送/返回视图控制器时出现错误“索引超出范围” - Swift
Posted
技术标签:
【中文标题】当我在真实设备中频繁推送/返回视图控制器时出现错误“索引超出范围” - Swift【英文标题】:Get Error "Index out of range" When I frequently push/back viewcontroller in real device - Swift 【发布时间】:2017-08-21 04:08:49 【问题描述】:我的 tableView 有问题。 当我经常在 ChatListViewController 和 detailViewController 之间推/回时,我会在 ListViewController 中崩溃并出现错误。 但我不知道我的数据在哪里崩溃。 我想我是否使用 GCD 来实现它? 有什么建议可以避免吗? 谢谢。
崩溃日志: 致命错误:索引超出范围
型号:
class ChatroomList:Model
var all:[Chatroom]
var rooms:[Chatroom] = [Chatroom]()
self.chatrooms.forEach( (id,chatroom) in
if showType.contains(chatroom.type)
rooms.append(chatroom)
)
return rooms
视图控制器:
import RxCocoa
import RxSwift
import Alamofire
class ListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
let chatrooms:ChatroomList = ChatroomList()
var list:[Chatroom] = [Chatroom]()
var subscribe:Disposable?
override func viewDidLoad()
super.viewDidLoad()
self.tableView.dataSource = self
self.tableView.delegate = self
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
subscribe = rooms.notifySubject.subscribe( json in
self.loadContents()
)
self.loadContents()
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(animated)
subscribe?.dispose()
func loadContents()
var idList:[String] = []
self.list.removeAll()
self.list = chatrooms.all
guard self.list.isEmpty == false else
return
DispatchQueue.global().async()
self.list = self.list.filter (chatroom) -> Bool in
if chatroom.id.isEmpty
return true
if idList.contains(chatroom.id)
return false
idList.append(chatroom.id)
return true
self.list.sort(by: (a,b) in
if a.message.datetime.isEmpty
return false
return a.message.datetime > b.message.datetime
)
DispatchQueue.main.async()
self.tableView.reloadData()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return list.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if list[indexPath.row].type == .city
let cell: ChatroomCityTableViewCell = ChatroomCityTableViewCell(style: .default, reuseIdentifier: nil)
cell.loadByCityChatroom(chatroom: list[indexPath.row], cityId: list[indexPath.row].cityId)
return cell
else
let cell: ChatroomTableViewCell = ChatroomTableViewCell(style: .default, reuseIdentifier: nil)
cell.loadByChatroom(chatroom: list[indexPath.row])
return cell
【问题讨论】:
发布您的崩溃日志和您的崩溃堆栈跟踪 我没有太多崩溃日志。我更新了。 ChatroomListViewController 出现错误? 是的。就像我的邮政编码 ViewController。 你能在ChatRoomListViewController
分享你的cellForRow
方法吗?
【参考方案1】:
在您的方案中启用僵尸对象。
选择您的应用程序方案 -> 运行 -> 诊断 -> 检查僵尸对象。
立即运行您的应用。这将为您提供有关崩溃的更准确信息。
希望这会有所帮助:)
【讨论】:
对我没有帮助。谢谢 @tolerate_Me_Thx 好的。启用僵尸对象将为您提供崩溃发生的原因和方法。您提到索引超出范围,是否发生在 cellForRowAt 方法中?【参考方案2】:您可以在 Internet 上找到很多关于在闭包内引用 self
及其含义的信息。在不深入细节的情况下,我只是建议在闭包内引用self
的地方使用[weak self]
。类似的东西
closure [weak self] _ in
self?.whatever()
【讨论】:
以上是关于当我在真实设备中频繁推送/返回视图控制器时出现错误“索引超出范围” - Swift的主要内容,如果未能解决你的问题,请参考以下文章