2017-03-31 28 views
0

隨機崩潰我是新來的Swift,我發現我的應用程序中有一些奇怪的崩潰。應用程序在viewWillDisappear()

Fabric報告說在viewWillDisappear()中發生了崩潰。

我有一個視圖控制器2個ViewControllers.User水龍頭按鈕,然後它們移動到B視圖 - 控制輸入的東西,他們的用戶回去了,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) 

} 
... 
} 

答:

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

} 
... 
} 

的事故發生隨機的,我測試了我的設備上,並沒有什麼其他happened.But說,他們可以重複這一崩潰。

我想知道我是使用委託還是其他原因造成的。

+1

你能發佈你的崩潰報告嗎? –

+5

該代碼中有三個感嘆號:'as!','text!','lesson!'。他們中的每一個都意味着「讓我崩潰」。 – matt

回答

1

您在viewWillDisappear中可能有問題,那裏有很多選項可能會導致您在強制展開時出現問題。

這是更好地爲崩潰安全:

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) 
    } 
} 
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中

安全地解開你的文本價值的答案

始終是非常使用!運營商時很謹慎。即使你認爲你可以保證該對象永遠不會是零。

1

如果在調用viewWillDisappearIndexPath{0,0}不可見,則該行將設置爲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() 
} 
相關問題