質問: https://qiita.com/yanashi222/items/121b549852bedf391377 この記事にしたがって、全く同じコードを書き、アプリを作りました。 最初はきちんと動いていたのですが、その後で自分でボタンの色や形を変えたりして実験していると、Thread 1: signal SIGABRTというエラーが出てきてしまい、動かなくなってしまいました。 実際にこのエラーが出るのは、 プラスボタンを押し、画面を遷移させ、UITextViewに文字を打ち込んだ後、「書く!」ボタンを押した瞬間です。 エラーの理由(?)として、 libc++abi.dylib: terminating with uncaught exception of type NSException という風に出ております。 エラーとその理由でGoogleで検索をかけた際は、解決策として、 黄色い三角の警告マークを無くすと解決、紐付けをやり直すと解決、の二つが出てきました。自分の場合、黄色い警告マークは出ていないのと、紐付けに関しても、Storyboardを使っている訳ではないので、紐付けをやり直すと解決、という方法も違うように思います。このエラーの解決法を知っている方がいれば、教えていただきたいです。 どうしようもなくなってしまい、質問させていただきました。初心者の質問で至らないところもあるとは思いますが、御教授のほど、どうぞよろしくお願い致します。
回答: 調べ方を間違えているので、調べ方を説明します。 `Thread 1: signal SIGABRT`や`libc++abi.dylib: terminating with uncaught exception of type NSException`は、エラーの理由を示すメッセージではありません。単にアプリがエラーで停止したという結果を表示しているだけあり、Storyboardの紐付けに問題があることを意味しているものではありません。 エラーの理由は、デバッグエリアのコンソールメッセージに`libc++abi.dylib: terminating with uncaught exception of type NSException`と表示されている前後の `reason:`に続く部分に書かれています。それを見てエラーの原因を調べる必要があります。Webを検索してエラーの原因を調べるなら`reason:`に続く部分を検索する必要があります。自分で解決できなくてteratailで質問する時も`reason:`に続く部分を示して質問しないと的確な回答は得られません。 (12/23追記) `reason:`に`'Invalid value '(null)' of type '(null)' for 'string' property 'Event.date'`と出ているのであれば、EventクラスのdateプロパティがString型なのに、そこにnilを代入しようとしたということだと思います。 「Event.dateというコードを書いていない」と言われていますが、記事を見ると、Realmのモデルクラスとして、Eventクラスのdateプロパティが定義されており、「書く!」ボタンを押した時に呼ばれるEventViewControllerのsaveEventメソッドの中で、次のような書き込み処理が行われています。 ``` try! realm.write { //日付表示の内容とスケジュール入力の内容が書き込まれる。 let Events = [Event(value: ["date": y_text.text, "event": eventText.text])] realm.add(Events) print("データ書き込み中") } ``` おそらく `let Events = [Event(value: ["date": y_text.text, "event": eventText.text])]` の処理でEventクラスのdateプロパティに設定しようとしている `y_text.text`がnilだったためエラーが発生したのだろうと推測できます。 そこで、元々の記事に問題があるのか、この記事通りに実装できていないのか切り分けるために、私の方でも記事通りのものを作ってみました。すると、あっさりと同じエラーが再現し、上記のエラー時点で`y_text.text`がnilになっていることを確認しました。元々の記事に問題があるようです。 どうして`y_text.text`がnilのままなのか確認するために、`y_text.text`に値を設定している場所を探したところ、pickerメソッドの中で設定されていましたが、このメソッドはUIDatePickerを操作して日付を変更した時に呼ばれるメソッドです。この場合UIDatePickerを操作しないで「書く!」ボタンをタップすると`y_text.text`に何も文字が設定されていないまま(nilのまま)書き込み処理が行われるため、今のエラーが発生します。ちなみに、UIDatePickerを操作してから「書く!」ボタンをタップすると正常に動作することも確認しました。 UIDatePickerを操作しないまま「書く!」ボタンをタップしても正常に動作するようにしたいなら、EventViewControllerのviewDidLoadメソッドの最後に次の処理を追加しておけば、`y_text.text`がnilのままということにならず、とりあえず動作するようになると思います。 ``` let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd" y_text.text = formatter.string(from: y.date) ```