Swiftで遊ぼう! - 976 - セグエに関するコメントの返事
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
久しぶりに下記のエントリーにコメントが入りました!
私がブログを続けている理由の1つは読者からのコメントです。berrymuchさん、本当にありがとうございます!
今日の記事は上記ブログの内容の続きです。
berrymuchさんから2つ指摘を受けました。まず最初のprepareメソッドに関して詳しく説明します。
私の理解している範囲でセグエの説明をします。
セグエのインスタンス化には以下の2つの方法があります。
- ストーリーボードで視覚的に生成(Ctrl + ドラッグ)
- コードで生成(performSegueを書く)
このどちらを利用してセグエを生成しても、遷移先のViewController生成メソッドは「prepare(for segue: UIStoryboardSegue, sender: Any?) 」です。そのため、このメソッドをoverrideしなければいけません。
私は最初に、ストーリーボードで視覚的にセグエを設定しました。つまりTextFieldから「Ctrl + ドラッグ」して遷移先のViewControllerに繋いで、Identifierの設定をしたということです。
そして遷延元のViewControllerに次のコードを加えました。
override func prepare(for segue:UIStoryboardSegue, sender:Any!) { if let identifier = segue.identifier { switch identifier { case "Show Datepopover": if let dateController = segue.destination as? DatePopoverController { dateController.delegate = self let widthX = birthTextField.bounds.midX if let popoverController = dateController.popoverPresentationController { popoverController.delegate = self popoverController.sourceRect = CGRect(x: widthX, y: self.view.frame.minY + 30, width: 0, height: 0) } } case "Show Numpadpopover": if let numpadPopover = segue.destination as? NumpadViewController { numpadPopover.delegate = self let widthX = idField.bounds.midX if let popoverController = numpadPopover.popoverPresentationController { popoverController.delegate = self popoverController.sourceRect = CGRect(x: widthX, y: self.view.frame.minY + 30, width: 0, height: 0) } } default: break } } }
これでシュミレーションを実行させてテキストフィールドをタッチすると、デフォルトのキーボードが出現するんです。このデフォルトのキーボードをマニュアルで閉じると遷移先ののPopoverが出現します。
どうしてもデフォルトのキーボードが最初に立ちあがるのを止めることができません。色々試していて上手く動いたのが先日お話したperformSegueの利用だったと言うわけです。
デフォルトのキーボードの消し方も色々あることは分かりました。resignFirstResponder()やtextFieldShouldBeginEditing(_ textField: UITextField)を色々使って、試していたらperformSegueで上手く動いたということです。
キーボードの制御に関して考えていると、berrymuchさんの2つめのアドバイスで「は!」と気がつきました。私の考えているデザインは、インターフェイスのガイドラインに全く準じていませんでした。
ユーザインターフェイスのデザインのヒント - Apple Developer
このページも全く知らなかったです。berrymuchさん、情報ありがとうございます。
カスタムPopoverを使おうと考えたのは、私のアプリはiPad専用を考えていたからです。iPhoneで「Number Pad」を利用すれば数字だけの入力ができるのですが、iPadでは「Number Pad」の利用ができません。そこで独自にPopoverからの入力を思いついた訳です。
しかし、ガイドラインを読むと、そういう勝手なインターフェイスは許されていないようですね。「TextFieldからPopoverのコントロールはガイドライン違反」と考えていいんでしょう。それで実装しにくいんじゃないかと思います。
そして思いついたんです。iPadで用意されていないのならカスタムキーボードを用意して入力すればガイドラインに準じていると思いました。
berrymuchさんのコメントでまた少し成長できました。ありがとうございました。
通りすがりの読者の皆さん、何でもいいのでコメントをお願いしますm(_ _)m
では。