🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

6920閲覧

Thread 1: signal SIGABRTの解決法

SenaK

総合スコア10

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/21 08:58

https://qiita.com/yanashi222/items/121b549852bedf391377
この記事にしたがって、全く同じコードを書き、アプリを作りました。
最初はきちんと動いていたのですが、その後で自分でボタンの色や形を変えたりして実験していると、Thread 1: signal SIGABRTというエラーが出てきてしまい、動かなくなってしまいました。

実際にこのエラーが出るのは、
プラスボタンを押し、画面を遷移させ、UITextViewに文字を打ち込んだ後、「書く!」ボタンを押した瞬間です。

エラーの理由(?)として、
libc++abi.dylib: terminating with uncaught exception of type NSException
という風に出ております。

エラーとその理由でGoogleで検索をかけた際は、解決策として、
黄色い三角の警告マークを無くすと解決、紐付けをやり直すと解決、の二つが出てきました。自分の場合、黄色い警告マークは出ていないのと、紐付けに関しても、Storyboardを使っている訳ではないので、紐付けをやり直すと解決、という方法も違うように思います。このエラーの解決法を知っている方がいれば、教えていただきたいです。

どうしようもなくなってしまい、質問させていただきました。初心者の質問で至らないところもあるとは思いますが、御教授のほど、どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

調べ方を間違えているので、調べ方を説明します。

Thread 1: signal SIGABRTlibc++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メソッドの中で、次のような書き込み処理が行われています。

swift

1try! realm.write { 2 //日付表示の内容とスケジュール入力の内容が書き込まれる。 3 let Events = [Event(value: ["date": y_text.text, "event": eventText.text])] 4 realm.add(Events) 5 print("データ書き込み中") 6}

おそらく
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のままということにならず、とりあえず動作するようになると思います。

swift

1let formatter = DateFormatter() 2formatter.dateFormat = "yyyy/MM/dd" 3y_text.text = formatter.string(from: y.date)

投稿2019/12/22 02:27

編集2019/12/22 15:09
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SenaK

2019/12/22 03:35 編集

TakeOne様 ご指摘ありがとうございます。存じ上げておらず、不思議な質問をしてしまい恥ずかしい限りです。 Reasonの所には、'Invalid value '(null)' of type '(null)' for 'string' property 'Event.date'.'という風に出ているのですが、Event.dateというコードを書いていないので、具体的にどこでどうしてnullになり問題が発生しているのか、と疑問に思っています。nullにしないために書かなければいけないコードがあるということでしょうか、もしよろしければ回答をよろしくお願いいたします。
TakeOne

2019/12/22 15:09

回答を追記しておきました。
SenaK

2019/12/23 11:31

本当にありがとうございます。試してみたいと思います。
SenaK

2019/12/24 09:06

エラーが消えて思う通りに動くようになりました。分かりやすい説明で助かりました。ありがとうございました。
uskitm

2020/11/03 08:35

横から失礼します。 同じく元記事を参考にアプリを作っているのですが、スケジュール欄を空の状態で「書く!」ボタンをタップすると同様のエラーになるのですが、対処法ありますでしょうか?
TakeOne

2020/11/04 14:16

この回答に書いてある対処法をやっても同じエラーが出るのだったら元々の記事の通りに作れていないのだと思います。解決できないのだったら人の質問に横から便乗せず、自分がやったことと起きた現象を新しい質問できちんと説明して質問すべきだと思います。
guest

0

このチュートリアル確認しました。無事にビルドできました。

  1. Storyboardは使われています。
  2. 考えられるのは、以下のステップをミスしたかもしれません。

そして、各StoryBoard IDを以下の様にする。
ViewController -> Main
EventViewController -> Insert

できた画面:
イメージ説明
イメージ説明

投稿2019/12/21 09:35

vanderlvov

総合スコア687

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SenaK

2019/12/21 23:14

実証していただいてありがたい限りです。一応Story Board IDの設定は済ましてある状況です。そこの設定がエラーの原因だとするならば、一度設定をやり直すという形でいいのでしょうか?一度、そこのところを設定し直してみたのですが、どうもうまくいかないので、やり方が間違っているのかなと思います。指南いただけると幸いです。
guest

0

まずは、どの行でその例外が出るのかを特定しましょう。
要所にブレークポイントを設定して、どこまで実行できているか、どこからダメなのかをチェックしていけば、例外の出る行が特定できると思います
それが判明したならば、その周辺のコードとともに提示して聞いていただければ、解決は早いかと思います

投稿2019/12/21 09:29

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SenaK

2019/12/22 03:33

ご指摘ありがとうございます。ブレークポイントに慣れていないので、やり方を勉強してみたいと思います。また判明したら追記したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問