【问题标题】:Fatal error : unexpectedly found nil - number of row致命错误:意外发现 nil - 行数
【发布时间】:2016-01-19 15:59:50
【问题描述】:

我的 UITableViewController 工作正常,直到最近它在初始加载时在 tableview 的 numberOfRowsInSection 处崩溃。

通过以下方法获取数据源:

  func reloadTheTable()
  {
    datasource = PlaceDataController.fetchAllPlaces()
    tableView?.reloadData()
  }

我的Realm模型中的方法是:

class func fetchAllPlaces() -> Results<PlaceItem>!
  {
    do
    {
      let realm = try Realm()
      return realm.objects(PlaceItem)
    }
    catch
    {
      return nil
    }
  }

如何调试此错误?它以前工作得很好。真是令人费解为什么它现在崩溃了。

【问题讨论】:

    标签: ios swift uitableview realm fatal-error


    【解决方案1】:

    我猜datasource 是根据fetchAllPlaces 返回类型隐式展开的可选项。

    首先,fetchAllPlaces不应该返回一个隐式展开的可选,因为你知道该值可以是nil,将其替换为:

    class func fetchAllPlaces() -> Results<PlaceItem>?
    {
        do
        {
            let realm = try Realm()
            return realm.objects(PlaceItem)
        }
        catch
        {
            return nil
        }  
    }
    

    另外,将您的 datasource 声明为可选。

    然后替换您的numberOfRowsInSection 方法:

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let dataSource = datasource {
            return dataSource.count
        }
        return 0
    }
    

    【讨论】:

    • 我同意,但是您的 numberOfRowsInSection 方法中的所有代码都可以替换为一行return datasource?.count ?? 0
    • 感谢 Michael 和 Lyndsey。你的建议奏效了!欣赏它。
    • @LyndseyScott:你说得完全正确,我只是习惯了这种格式以提高可读性,并且很难改变^^
    • 当我知道函数可以返回 nil 值时,我倾向于使用可选的返回类型超时:这样更容易在代码中找到问题。我对变量做同样的事情,我唯一一次使用隐式解包变量是当我确定它们会很快并且确定地初始化时(例如在 viewDidLoad 中)。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多