2017-03-31 20 views
0

私はSwiftを初めて使っています。私はアプリで奇妙なクラッシュを見つけました。viewWillDisappear()にアプリケーションがランダムにクラッシュする

ファブリックは、viewWillDisappear()でクラッシュが発生したと報告しています。

私は、彼らが入力何かにBののViewControllerに移動するのViewControllerで2つのViewControllers.Userタップボタンを持って、彼らは、ユーザー戻って、そして私は、このタスクを完了するために、デリゲートを使用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() 

} 
... 
} 

クラッシュがランダムに起こった、私は私のデバイス上でそれをテストしていない、と他の人が、彼らはこのクラッシュを繰り返すことができると言いましたhappened.But何もしました。

私はデリゲート権を使用しているのか、それとも他の理由によるのだろうと思います。

+1

クラッシュレポートを投稿できますか? –

+5

このコードには、 'as!'、 'text!'、 'lesson!'という3つの感嘆符があります。それらのすべてが「クラッシュ・ミー」を意味します。 – 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() 
} 

は安全にB

にテキスト値のラップを解除する方法については、@ orxelmの回答を参照してください。

!オペレータを使用する場合、常に非常にになるようにしてください。たとえオブジェクトが無限にならないことを保証できると思っても。

1

viewWillDisappearが呼び出されたときにIndexPath{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() 
} 
関連する問題