创建日历时中断错误

时间:2017-03-30 03:37:50

标签: ios swift

Pic of error

有中断错误线程1:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码== 0x0)。没有构建错误,只是在运行时,有休息

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

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!

//错误发生在这里

    if self.calendars != nil {
    let calendarName = self.calendars?[(indexPath as NSIndexPath).row].title
        cell.textLabel?.text = calendarName
    } else {
        cell.textLabel?.text = "Unknown Calendar Name"
    }
    return cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destinationVC = segue.destination as! UINavigationController
    let addCalendarVC = destinationVC.viewControllers[0] as! AddCalendarViewController
    addCalendarVC.delegate = self
}
func calendarDidAdd() {
    self.loadCalendars()
    self.refreshTableView()
}

}

2 个答案:

答案 0 :(得分:1)

tableView.dequeueReusableCell(withIdentifier: "Cell")!

您正在展开可选的值,该值可能首先为nil。单元格可能尚未创建,特别是如果您尚未使用该标识符注册该单元格的类,那么它会在第一次表格尝试填充单元格时崩溃。您应首先检查单元格是否为nil

var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
if cell == nil {
  cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
}
...

答案 1 :(得分:0)

我看到的直接红旗在这里:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!

当出列可重复使用的单元格时,我喜欢将它们包装在保护语句中,因此我的应用程序不会崩溃。当出现问题时,它还会告诉我更多信息:

guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") else {
    print("couldn't dequeue a reusable cell for identifier Cell in \(#function)")
    return UITableViewCell()
}

这次崩溃可能有几个原因。您可能忘记注册重用标识符,但如果您使用的是故事板,则会为您处理。可能只是输入错误或者您忘记输入该单元格的重用标识符。