Ios 应用程序在ViewWillEnglishe()上随机崩溃

Ios 应用程序在ViewWillEnglishe()上随机崩溃,ios,swift,Ios,Swift,我是Swift新手,在我的应用程序中发现一些奇怪的崩溃 Fabric报告称,ViewWillEnglishe()中发生了崩溃 我有两个viewcontroller。用户点击viewcontroller中的按钮,然后他们移动到B viewcontroller输入内容,他们返回,A从B获取信息 我使用代理完成此任务 B: A: 崩溃是随机发生的,我已经在我的设备上进行了测试,但什么也没发生。但其他人说他们可能会重复这种崩溃 我想知道我是否正确使用了委托,还是因为其他原因造成的。您可能在视图中遇到问题

我是Swift新手,在我的应用程序中发现一些奇怪的崩溃

Fabric报告称,ViewWillEnglishe()中发生了崩溃

我有两个viewcontroller。用户点击viewcontroller中的按钮,然后他们移动到B viewcontroller输入内容,他们返回,A从B获取信息

我使用代理完成此任务

B:

A:

崩溃是随机发生的,我已经在我的设备上进行了测试,但什么也没发生。但其他人说他们可能会重复这种崩溃


我想知道我是否正确使用了委托,还是因为其他原因造成的。

您可能在视图中遇到问题。如果视图消失,则在强制展开时有许多选项可能会给您带来麻烦

最好是防撞安全:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let lessonName = (tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as? UITextField)?.text {
        delegate?.changeLessonNameTag(name: lessonName, tag: tagColor)
    }
}

您可能在视图中遇到了问题。当您强制展开时,视图中有许多选项可能会给您带来麻烦

最好是防撞安全:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let lessonName = (tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as? UITextField)?.text {
        delegate?.changeLessonNameTag(name: lessonName, tag: tagColor)
    }
}

我的直觉反应是,你要强制展开的对象之一实际上是
nil

func changeLessonNameTag(name:String,tag:UIColor){
    self.lesson?.lessonName = name
    self.lesson?.lessonTagColor = tag
    tableView.reloadData()
}
而不是使用
强制展开它,您应该安全地打开它,如果它不存在,则会优雅地失败:

func changeLesson(name: String, tag: UIColor) {    //Updated formatting and method declaration to fit with current Swift standards
    guard let lesson = lesson else {    //Don't need to reference self here
        return
    }

    lesson.lessonName = name
    lesson.lessonTagColor = tag

    tableView.reloadData()
}
请参阅@orxelm的答案,了解如何安全地在B中展开文本值


在使用
时,请始终保持非常的警惕操作员。即使你认为你可以保证物体永远不会为零。

我的直觉反应是,你正在强制展开的物体中有一个实际上是
nil

func changeLessonNameTag(name:String,tag:UIColor){
    self.lesson?.lessonName = name
    self.lesson?.lessonTagColor = tag
    tableView.reloadData()
}
而不是使用
强制展开它,您应该安全地打开它,如果它不存在,则会优雅地失败:

func changeLesson(name: String, tag: UIColor) {    //Updated formatting and method declaration to fit with current Swift standards
    guard let lesson = lesson else {    //Don't need to reference self here
        return
    }

    lesson.lessonName = name
    lesson.lessonTagColor = tag

    tableView.reloadData()
}
请参阅@orxelm的答案,了解如何安全地在B中展开文本值


在使用
时,请始终保持非常的警惕操作员。即使您认为可以保证对象永远不会为零。

如果调用
viewwilldiscover
IndexPath{0,0}
不可见,那么此行将设置
lessonName=nil
,因为该行没有单元格。这将导致以下线路崩溃

lessonName = tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!
正如其他人所提到的,有太多的强制展开

但是,除非该单元格是由用户动态填充的,否则您应该能够从
UITableViewDataSource
中获得相同的值-因此,如果该单元格可见或不可见,它将起作用

此外,不要在代理方法中强制展开
课程
——可能是
nil

func changeLessonNameTag(name:String,tag:UIColor){
    self.lesson?.lessonName = name
    self.lesson?.lessonTagColor = tag
    tableView.reloadData()
}

如果调用
viewwilldemouse
IndexPath{0,0}
不可见,则此行将设置
lessonName=nil
,因为该行没有单元格。这将导致以下线路崩溃

lessonName = tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!
正如其他人所提到的,有太多的强制展开

但是,除非该单元格是由用户动态填充的,否则您应该能够从
UITableViewDataSource
中获得相同的值-因此,如果该单元格可见或不可见,它将起作用

此外,不要在代理方法中强制展开
课程
——可能是
nil

func changeLessonNameTag(name:String,tag:UIColor){
    self.lesson?.lessonName = name
    self.lesson?.lessonTagColor = tag
    tableView.reloadData()
}

你能发布你的坠机报告吗?代码中有三个感叹号:
as
文本
课程。它们都是“撞车我”的意思。你能发布你的撞车报告吗?代码中有三个感叹号:
as
文本
课程。他们每个人的意思都是“撞死我”