質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

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

Swift

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

Q&A

解決済

2回答

372閲覧

エラーコードの対処法について

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/06/10 04:06

編集2019/06/10 06:51
コード ```### 前提・実現したいこと プログラミング初心者になります。 UIpicker対応のtextfieldを2つ置いて、最初のtextfieldで選択した値によって 次のtextfieldで選択できるpickerの値が変わるものを作成したのですが Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value というエラーコードが出てしまいビルドできません。 どのように対処すればよろしいのでしょうか? ご教授お願いいたします。 ### 発生している問題・エラーメッセージ

active_textfield.text = current_arr[row]
Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

import UIKit

class ViewController: UIViewController,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource {

@IBOutlet weak var text_field_daieria: UITextField! @IBOutlet weak var text_field_chueria: UITextField! let chueria_dic:[String:[String]] = [ "北海道地方":["","北海道"], "東北地方":["","青森県","秋田県","岩手県","宮城県","山形県","福島県"]] let daieria_arr = ["","北海道地方","東北地方"] let chueria_arr = ["","北海道","青森県","秋田県","岩手県","宮城県","山形県","福島県"] let my_pickerView = UIPickerView() var current_arr : [String] = [] var active_textfield : UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. text_field_daieria.delegate = self text_field_chueria.delegate = self my_pickerView.delegate = self my_pickerView.dataSource = self text_field_daieria.inputView = my_pickerView text_field_chueria.inputView = my_pickerView } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { active_textfield = textField switch textField{ case text_field_daieria:current_arr = daieria_arr case text_field_chueria: if let daieria = text_field_daieria.text,!daieria.isEmpty{ current_arr = chueria_dic[daieria]! }else{ current_arr = chueria_arr } default:print("default") } my_pickerView.reloadAllComponents() return true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return current_arr.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return current_arr[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { active_textfield.text = current_arr[row]

}
}

### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ```ここに言語を入力 import UIKit class ViewController: UIViewController,UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource { @IBOutlet weak var text_field_daieria: UITextField! @IBOutlet weak var text_field_chueria: UITextField! let chueria_dic:[String:[String]] = [ "北海道地方":["","北海道"], "東北地方":["","青森県","秋田県","岩手県","宮城県","山形県","福島県"]] let daieria_arr = ["","北海道地方","東北地方"] let chueria_arr = ["","北海道","青森県","秋田県","岩手県","宮城県","山形県","福島県"] let my_pickerView = UIPickerView() var current_arr : [String] = [] var active_textfield : UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. text_field_daieria.delegate = self text_field_chueria.delegate = self my_pickerView.delegate = self my_pickerView.dataSource = self text_field_daieria.inputView = my_pickerView text_field_chueria.inputView = my_pickerView } //修正箇所 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { switch textField{ case text_field_daieria:current_arr = daieria_arr case text_field_chueria: if let daieria = text_field_daieria.text,!daieria.isEmpty{ current_arr = chueria_dic[daieria]! }else{ current_arr = chueria_arr } default:print("default") } my_pickerView.reloadAllComponents() return true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return current_arr.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return current_arr[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { **active_textfield.text = current_arr[row]**//ここで、Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional valueとエラーが出ます。 } }

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {

はテキストの入力が終わりそうな時に呼ばれますが、本当は「始まった時」に呼ばれたいのではないですか?

であれば

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool

func textFieldDidBeginEditing(_ textField: UITextField)

辺りをトリガーにしてください。

投稿2019/06/10 06:10

takabosoft

総合スコア8356

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

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

退会済みユーザー

退会済みユーザー

2019/06/10 06:25

誠にありがとうございます! 教えていただいた通り func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool と直したところビルドできました。 しかし Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value というエラーが出てしまいました。 どうすればよろしいのでしょうか? 教えてください。よろしくお願いいたします。
takabosoft

2019/06/10 06:45

どこで出ているかをどうぞ。
takabosoft

2019/06/10 06:50

あー、大体やりたいことがわかりました。 たぶん、active_textfield?.text = current_arr[row] とでもすればOptionalのランタイムエラーは出なくなりそうです。
退会済みユーザー

退会済みユーザー

2019/06/10 06:56

ありがとうございます! エラーは消えました。本当に感謝です。 しかし、 simulatorにおいてpickerで各地方、各県を選択(表示はされています)できない状況となっております。
takabosoft

2019/06/10 06:57

現状の全コードをどこかに貼ってもらえますか。
takabosoft

2019/06/10 07:06

active_textfield = textField を入れ忘れてるっぽいですよ。
退会済みユーザー

退会済みユーザー

2019/06/10 07:07

補足情報に貼らせていただきましたm(_ _)m
takabosoft

2019/06/10 07:10

再放送ですが、 active_textfield = textField を入れ忘れてるっぽいですよ。 textFieldShouldBeginEditingに入れ替えるときに間違って消してしまっていませんか?
takabosoft

2019/06/10 07:11 編集

それが入っていればactive_textfield?.text = current_arr[row]の?は不要になるはずです(入っていても問題ありませんが)。
退会済みユーザー

退会済みユーザー

2019/06/10 07:12

どこにいれればよろしいですか? めぼしいところに入れてもエラーになってしまいます(涙)
takabosoft

2019/06/10 07:12

めぼしいというか、最初の質問コードには入っているではありませんか。
退会済みユーザー

退会済みユーザー

2019/06/10 07:22

最初に教えていただいたコードを入力した際に、誤って消してしまっていたようです。 出来ました! 本当、本当にありがとうございました。 感謝いたします。 また何かありましたら、どうぞよろしくお願いいたします。
takabosoft

2019/06/10 07:46

どういたしまして。dsuzukiさんのコメントと同じようなことをお伝えしますが、コード等をコピペ等で持ってくるのはかまいません。ただし、どのコードがいつどう動くか、なんのためにその処理があるのか、などを正しく理解(or理解する努力)をしてくださいね。
退会済みユーザー

退会済みユーザー

2019/06/10 07:59

はい、精進いたします。
guest

0

active_textfield がnilだからです。
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool
が呼ばれるよりも前に
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
が呼ばれるケースを想定してください。

投稿2019/06/10 04:17

dsuzuki

総合スコア1682

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

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

退会済みユーザー

退会済みユーザー

2019/06/10 04:30

ご回答ありがとうございます。 func textFieldShouldEndEditing(_ textField: UITextField) -> Boolを func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) の後に持って来れば良いということでしょうか?
dsuzuki

2019/06/10 04:43

記述順の問題ではありません。 それぞれのfuncがいつ呼ばれるかは、ViewController外部(画面操作)に依存します。 active_textfieldがnilのケースを想定してください。 もしくは、引数のpickerViewを元に、確実に参照できるUITextFieldを指定してください。
退会済みユーザー

退会済みユーザー

2019/06/10 04:59

nilのケースを想定するにはどうすればよろしいのでしょうか? simulatorでビルドすると二つのtextfieldには何も値がない状態で 下の県名をタップするとエラーが出てしまいます。
dsuzuki

2019/06/10 05:05

> nilのケースを想定するには active_textfieldはどんな時にnilからUITextFieldのインスタンスに変化しますか? func pickerView(...) が呼ばれるのはどんな時ですか? > エラーが出てしまいます。 どこで、どんなエラー情報が表示されているのか、具体的なエラー情報を記載してください。 状況が把握できませんし、回答できません。
退会済みユーザー

退会済みユーザー

2019/06/10 05:44

>active_textfieldはどんな時にnilからUITextFieldのインスタンスに変化するか はじめに何地方かが選択された時でしょうか? func pickerView(...) が呼ばれるのはどんな時か わかりません。。 >エラーについて Pickerにchueria_dicで指定した文字がないということです。
dsuzuki

2019/06/10 06:44

基本的なことですが、printやログツールを利用して、自身が作成したコードがどんなタイミングでどのメソッドが呼ばれているかを確認してください。 そうしないと、処理を実装していても、呼ばれていないから反映されていないのか、呼ばれているけど実装が間違っているのかが判断できません。 そして、ログを使用すれば、func pickerView(...) がどのタイミングで呼ばれているのかわかるはずです。 > Pickerにchueria_dicで指定した文字がない pickerViewに表示される文字列は func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) で生成されます。 このメソッドで扱っているcurrent_arrの初期値はゼロ配列です。 func textFieldShouldEndEditing(_ textField: UITextField)でdaieria_arr or chueria_arr配列を設定していますが、このメソッドが呼ばれない限りpickerには何も表示されません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問