由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 0 超出范围(必须小于 0)。”迅速

Posted

技术标签:

【中文标题】由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 0 超出范围(必须小于 0)。”迅速【英文标题】:Terminating app due to uncaught exception 'RLMException', reason: 'Index 0 is out of bounds (must be less than 0).' Swift 【发布时间】:2020-06-27 05:12:33 【问题描述】:

我正在尝试制作一个生产力应用程序。代码如下:

import Foundation
import RealmSwift

class TimeCardData: Object 
    @objc dynamic var clockIn3: String = ""
    @objc dynamic var clockOut3: String = ""
    @objc dynamic var minutes3: Int = 0
    @objc dynamic var productivity3: String = ""
    @objc dynamic var lunch3: String = ""
    @objc dynamic var groupNumber3: String = ""
    @objc dynamic var group3: String = ""
    @objc dynamic var timeWorked3: String = ""
    @objc dynamic var clockInDate3 = ""
    @objc dynamic var hoursWorked3: String = ""


class TimeCardViewController: UIViewController 
    
    let realm = try! Realm()
    
    var timeCardData : Results<TimeCardData>?
    
    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var tableView: UITableView!
    
    var clockInDate2 = ""
    var hoursWorked2 = ""
    var timeWorked2 = ""
    var productivity2 = ""
    var clockIn2 = ""
    var clockOut2 = ""
    var lunch2 = ""
    var minutes2 = 0
    var groupNumber2 = ""
    var group2 = ""
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
        tableView.rowHeight = 100.0
        loadTimeCardData()

    
    
    func saveTimeCardData(timeCardData: TimeCardData) 
        do 
            try realm.write 
                realm.add(timeCardData)
            
         catch 
            print("Error saving TimeCard Data \(error)")
        
        
        tableView.reloadData()
    
    
    func loadTimeCardData() 
        
        timeCardData = realm.objects(TimeCardData.self)
        tableView.reloadData()
    


extension TimeCardViewController: UITableViewDataSource, UITableViewDelegate 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        
        return timeCardData?.count ?? 1
            
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell =  tableView.dequeueReusableCell(withIdentifier: "TimeCardCell", for: indexPath) as! TimeCardTableViewCell
        
        cell.productivity?.text = timeCardData?[indexPath.row].productivity3
        cell.hoursWorked?.text = timeCardData?[indexPath.row].hoursWorked3
        cell.clockInDate?.text = timeCardData?[indexPath.row].clockInDate3
        cell.timeWorked?.text = timeCardData?[indexPath.row].timeWorked3
        
        return cell
    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        
        let TCD = TimeCardData()
            TCD.clockIn3 = clockIn2
            TCD.clockOut3 = clockOut2
            TCD.group3 = group2
            TCD.lunch3 = lunch2
            TCD.minutes3 = minutes2
            TCD.groupNumber3 = groupNumber2
            TCD.productivity3 = productivity2
            TCD.timeWorked3 = timeWorked2
            TCD.clockInDate3 = clockInDate2
            TCD.hoursWorked3 = hoursWorked2
            
            saveTimeCardData(timeCardData: TCD)
        
    
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete 
            
            do 
                       try realm.write 
                        let cellToBeDeleted = timeCardData![indexPath.row]
                        realm.delete(cellToBeDeleted)
                       
                    catch 
                       print("Error deleting TimeCard Data \(error)")
                   
        
    


问题出在numberOfRowsInSection,当我return timeCardData?.count ?? 1 时,我的桌子上没有任何单元格。我认为它返回 0,因此它不带一个单元格。如果我只返回 1 或任何其他数字或上述以外的任何数字,则应用程序崩溃并给我“索引 0 超出范围(必须小于 0)”。崩溃的原因。这是我的第一个应用程序之一,我被卡住了,不知道如何解决这个问题。我做错了什么,从现在开始我该如何继续?

【问题讨论】:

这个问题解决了吗?你能分享你的解决方案吗? 【参考方案1】:

我得到了相同的 RLMException 。 我发现我的错误是我从 Realm 中获取对象,例如:

let objects = realm.objects(PlaylistItem.self)

并将完全相同的对象发送到领域的删除功能:

realm.delete(objects)

属于 Results 类型并在每次删除时更新(是引用类型)..

所以我的答案是通过使用 Array()

传递您想要删除的项目的副本
realm.delete(Array(objects))

【讨论】:

以上是关于由于未捕获的异常“RLMException”而终止应用程序,原因:“索引 0 超出范围(必须小于 0)。”迅速的主要内容,如果未能解决你的问题,请参考以下文章

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,