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

时间:2017-03-31 14:16:59

标签: ios swift

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

Fabric报告称在viewWillDisappear()中发生了崩溃。

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

我使用委托完成此任务。

B:

class LessonNameTagTableViewController: UITableViewController {

...

var delegate:PassingData?

override func viewWillDisappear(_ animated: Bool) {

    lessonName = (tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!

    delegate?.changeLessonNameTag(name: lessonName, tag: tagColor)
    super.viewWillDisappear(animated)

}
...
}

A:

class LessonEditTableViewController: UITableViewController,PassingData {
var lesson :Lesson?
...
func changeLessonNameTag(name:String,tag:UIColor){
    self.lesson!.lessonName = name
    self.lesson!.lessonTagColor = tag
    tableView.reloadData()

}
...
}

崩溃是随机发生的,我在我的设备上测试过,没有发生任何事情。但是其他人说他们可以重复这次崩溃。

我想知道我是否正确使用代表,或者是由于其他原因造成的。

3 个答案:

答案 0 :(得分:1)

你可能在viewWillDisappear中遇到问题,那里有很多选项,当你强制解包时会给你带来麻烦。

安全可靠性更好:

$('#chat_grab').load('chat_grab.php', callback);

function callback() {
    $('#chat_grab').scrollTop(0);
    }

答案 1 :(得分:1)

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

lessonName = tableView.cellForRow(at: IndexPath(row: 0, section: 0))?.viewWithTag(1) as! UITextField ).text!

正如其他人所提到的,有太多的强迫解开。

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

此外,不要强行在代理方法中解包lesson - 可以是nil

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

答案 2 :(得分:0)

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

使用!而不是强行展开它,你应该安全地展开它,如果它不存在则优雅地失败:

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

中安全地展开文本值

使用!运算符时始终非常警惕。即使你认为你可以保证对象永远不会是零。