当我在真实设备中频繁推送/返回视图控制器时出现错误“索引超出范围” - 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的主要内容,如果未能解决你的问题,请参考以下文章

发送推送通知时出现 Worklight 错误

推送视图控制器后出现意外延迟

为啥我尝试在真实设备中运行代码时出现以下错误?

搜索控制器处于活动状态时出现表格视图时隐藏的第一行

在 GCM 中发送推送通知时出现未经授权的错误

推送时出现大标题导航栏和搜索栏的错误