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

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

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

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

Q&A

解決済

2回答

398閲覧

textFieldのキーボードが閉じれない

nakatsu6723

総合スコア38

Swift

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

0グッド

1クリップ

投稿2017/12/09 13:14

編集2017/12/10 09:16

swiftでボタンがタップされたらxibファイルで作成したviewを表示し、そこにあるtextfieldの入力が終了したら表示をやめる処理を書きたいです。
タップされたら表示されるまでは出来たのですが、キーボードを閉じたくてtextFieldShouldReturnを呼ぼうとしたのですが、そもそもこのメソッドが呼ばれません。
ボタンで閉じる方法も試みたのですが、タップの処理が呼ばれないです(見た目上ではタップされたアニメーションは動いています)

xibで作成して呼んだ事が絡んで来ると思っているのですが、何かアドバイスあればいただけると幸いです。

ViewController.swiftの一部

swift

1 @IBAction func inputText(_ sender: UIButton) { 2 let textViewController = TextViewController() 3 textViewController.embed(in: self) 4 }

表示したViewのController

swift

1import UIKit 2 3class TextViewController: UIViewController, UITextFieldDelegate { 4 5 6 @IBOutlet weak var inputText: UITextField! 7 @IBOutlet weak var endEdittingButton: UIButton! 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 inputText.delegate = self 13 endEdittingButton.addTarget(self, action: #selector(endEdit), for: .touchUpInside) 14 } 15 16 override func didReceiveMemoryWarning() { 17 super.didReceiveMemoryWarning() 18 // Dispose of any resources that can be recreated. 19 } 20 21 @objc func endEdit() { 22 print("a") 23 } 24 25 func embed(in parent: UIViewController) { 26 self.view.frame = parent.view.bounds 27 parent.view.addSubview(self.view) 28 self.didMove(toParentViewController: parent) 29 } 30 31 func unembed() { 32 self.willMove(toParentViewController: nil) 33 self.view.removeFromSuperview() 34 self.removeFromParentViewController() 35 } 36 37 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 38 print("a") 39 textField.resignFirstResponder() 40 return true 41 } 42 43 @IBAction func EndEditting(_ sender: UIButton) { 44 print("a") 45 inputText.endEditing(true) 46 self.unembed() 47 }

storyboardの設定
![イメージ説明]

イメージ説明

![イメージ説明]

イメージ説明

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

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

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

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

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

xAxis

2017/12/09 13:50

このtextViewControllerとかViewControllerって両方ともStoryboard上でcustomclassに設定されてます?
nakatsu6723

2017/12/09 16:12

xibの方はFile's OwnerにtextViewControllerを設定してます。ViewのCustom Classには設定していません。
xAxis

2017/12/10 04:20

StoryboardにViewControllerはあってもtextViewControllerは無いように見えます。これは何か特別な理由がありますか?
nakatsu6723

2017/12/10 06:10

2枚目の画像のCustom ClassのところにTextViewControllerが設定されているはずですが、それのことではないですか?
xAxis

2017/12/10 06:13

TextViewController.swiftは多分あるだろうとは思うのですが1枚目の画像にはViewControllerだけでTextViewControllerが見受けられないので疑問に思いました。
xAxis

2017/12/10 06:14

もしかしてStoryboard Referenceとかで分割されてたりします?
nakatsu6723

2017/12/10 09:18

Main.StoryboardにはViewControllerのみです。プロジェクトにはTextView.xibとTextViewController.swiftがあります。
nakatsu6723

2017/12/10 09:19

Referenceで分割はしていないのですが、TextView.xibとして切り出しています。xibのFile's OwnerにTextViewController.swiftを指定するだけでいけると思ったのですが、間違っていますか?(このViewの表示までは動きます)
xAxis

2017/12/10 10:35

私の理解ではxibファイルは何かしらロードをしないと使えないという認識だったのですが表示は出来るのですね。。。知らなかったです。TextViewControllerのviewDidLoad内でinputTextをprintしてもらえますか?
nakatsu6723

2017/12/10 11:08

<UITextField: 0x14e115200; frame = (16 318; 268 30); text = ''; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x1c084b490>; layer = <CALayer: 0x1c4226ec0>>
nakatsu6723

2017/12/10 11:12

↑が出力結果です。ちなみにlet viewController = TextViewController, present(viewController ...)とやると普通にdelegateメソッドが呼ばれます。今回は諸事情あり、self.embedメソッドから呼びたい状況なので困っています。
xAxis

2017/12/10 11:20

うーん、あと思いつくのはembeddedってことはTextViewControllerってContainerViewに入れたりしてます?
nakatsu6723

2017/12/10 11:22

ContainerViewに入れるとはなんでしょう?意図的にするものであれば何もしてないはずです。
xAxis

2017/12/10 11:30

>ContainerViewに入れる というのはContainerViewにTextViewControllerを埋め込んでいるのかと考えてお聞きしました。
xAxis

2017/12/10 11:34

それならembed(in:)内でinputText.delegate = selfとするのは試されました?
nakatsu6723

2017/12/10 14:43

いや入れてないです。今embedの最後の行に追加してみましたが、変わらずです。
guest

回答2

0

こちら解決しました。

結論としてはViewController内でTextViewController型の変数を作っておいて、embedで出現させるTextViewControllerを先ほどの変数に代入しておけばdelegateが呼ばれるようになりました。
ViewControllerがTextViewControllerの参照を失っていたことが原因のようです。

xAxisさん、粘り強く議論していただきありがとうございます。

投稿2017/12/13 04:51

nakatsu6723

総合スコア38

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

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

0

ベストアンサー

###追記
あまり回答が意味を成していないのですが一応おいておきます。

###考察

かなり考えたのですが自分の知識のどこに誤解があるのか結局分からず可能な限り近めの構成でなおかつ最小の構成を用意してテストしました。
環境
swift4
xcode9.2

swift4

1class ViewController: UIViewController { 2 @IBAction func tap(_ sender: UIButton) { 3 let textVC = TextViewController() 4 print("textField = (textVC.textField) in ViewController") 5 textVC.embed(in: self) 6 } 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 } 11 override func didReceiveMemoryWarning() { 12 super.didReceiveMemoryWarning() 13 } 14}

swift4

1class TextViewController: UIViewController, UITextFieldDelegate { 2 @IBOutlet weak var textField: UITextField! //from CustomTextField.xib 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 textField.delegate = self 7 print("call textField = (textField) in viewDidLoad") 8 } 9 override func didReceiveMemoryWarning() { 10 super.didReceiveMemoryWarning() 11 } 12 func embed(in parent: UIViewController) { 13 self.view.frame = parent.view.bounds 14 parent.view.addSubview(self.view) 15 self.didMove(toParentViewController: parent) 16 } 17 18}

画像に表示されているcustomclassはFile's Ownerのものです。
image
TextViewControllerにあるtextFieldはCustomTextField.xibよりIBOutlet接続してあります。
printの結果は

textField = nil in ViewController (lldb)

となり、textFieldがnilであるためtextField.delegate = selfの行でFatal errorとなりました。つまり質問の中にあるinputTextはどこか別のところから接続してあるのではないかと考えられます。またFile's OwnerであってもIBOutlet接続だけではダメでロード作業は必要になるはずです。
以上より回答はcustomviewのある.xibファイルから正しくIBOutlet接続を行い、ロードも正しく行う、となります。

投稿2017/12/10 15:00

編集2017/12/13 06:59
xAxis

総合スコア1349

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

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

nakatsu6723

2017/12/10 16:24

んー、やっぱり駄目っぽいですね。 お付き合い頂きありがとうございます。
nakatsu6723

2017/12/12 12:45

こちら解決しました。 結論としてはViewController内でTextViewController型の変数を作っておいて、embedで出現させるTextViewControllerを先ほどの変数に代入しておけばdelegateが呼ばれるようになりました。 ViewControllerがTextViewControllerの参照を失っていたことが原因のようです。 粘り強く議論していただきありがとうございます。
xAxis

2017/12/12 14:45

こちらこそ全くお力になれずに申し訳ないです。そして解決したことをご報告いただきありがとうございます。 ベストアンサーをいただけるのは嬉しいのですが実際取られた解決方法と自分の回答とは乖離していますから自己解決とされた方が相応しいです。今後近い問題に出会った人がいたら助けになりますでしょうし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問