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 }
このtextViewControllerとかViewControllerって両方ともStoryboard上でcustomclassに設定されてます?
xibの方はFile's OwnerにtextViewControllerを設定してます。ViewのCustom Classには設定していません。
StoryboardにViewControllerはあってもtextViewControllerは無いように見えます。これは何か特別な理由がありますか?
2枚目の画像のCustom ClassのところにTextViewControllerが設定されているはずですが、それのことではないですか?
TextViewController.swiftは多分あるだろうとは思うのですが1枚目の画像にはViewControllerだけでTextViewControllerが見受けられないので疑問に思いました。
もしかしてStoryboard Referenceとかで分割されてたりします?
Main.StoryboardにはViewControllerのみです。プロジェクトにはTextView.xibとTextViewController.swiftがあります。
Referenceで分割はしていないのですが、TextView.xibとして切り出しています。xibのFile's OwnerにTextViewController.swiftを指定するだけでいけると思ったのですが、間違っていますか?(このViewの表示までは動きます)
私の理解ではxibファイルは何かしらロードをしないと使えないという認識だったのですが表示は出来るのですね。。。知らなかったです。TextViewControllerのviewDidLoad内でinputTextをprintしてもらえますか?
<UITextField: 0x14e115200; frame = (16 318; 268 30); text = ''; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x1c084b490>; layer = <CALayer: 0x1c4226ec0>>
↑が出力結果です。ちなみにlet viewController = TextViewController, present(viewController ...)とやると普通にdelegateメソッドが呼ばれます。今回は諸事情あり、self.embedメソッドから呼びたい状況なので困っています。
うーん、あと思いつくのはembeddedってことはTextViewControllerってContainerViewに入れたりしてます?
ContainerViewに入れるとはなんでしょう?意図的にするものであれば何もしてないはずです。
>ContainerViewに入れる というのはContainerViewにTextViewControllerを埋め込んでいるのかと考えてお聞きしました。
それならembed(in:)内でinputText.delegate = selfとするのは試されました?
いや入れてないです。今embedの最後の行に追加してみましたが、変わらずです。
回答2件
あなたの回答
tips
プレビュー