Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 976 - セグエに関するコメントの返事

久しぶりに下記のエントリーにコメントが入りました!

私がブログを続けている理由の1つは読者からのコメントです。berrymuchさん、本当にありがとうございます!

yataiblue.hatenablog.com

今日の記事は上記ブログの内容の続きです。

berrymuchさんから2つ指摘を受けました。まず最初のprepareメソッドに関して詳しく説明します。

私の理解している範囲でセグエの説明をします。

セグエのインスタンス化には以下の2つの方法があります。

  1. トーリーボードで視覚的に生成(Ctrl + ドラッグ)
  2. コードで生成(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

では。