杏z学習帳

Swift、Unityなどを中心に節操なく手を出してますまる

IQKeyboardManagerでPrev/Nextボタンが表示されない場合の対処方法(2019/05/27)

[Swift]IQKeyboardManagerでPrev/Nextボタンが表示されない場合の対処方法

ざっくりまとめ。

です。

IQKeyboardManager とは

キーボード周りをよしなに調整してくれるやつで、
キーボード表示したときに対象の TextField なんかが見えるようにスクロールしてくれたり、
キーボードにツールバーを追加表示させて、完了ボタンやフォーカス移動をしてくれるボタンを設置してくれたりします。
今回はそのフォーカス移動をしてくれるボタンの話です。

環境

問題

UIScrollView + UIStackView という構造にして画面を組んでいた時に発生したのですが、
IQKeyboardManager を有効にしているにもかかわらず、キーボードに付属して表示されるツールバーに Prev/Next ボタンが表示されないという問題が。

Prev/Nextが出ない

UIScrollView + UIStackView だと必ず発生するというわけでもなくて、UIStackView 内の View のネストが深い場合にどうやら発生するみたいでした。

UIView
  └ UIScrollView
      └ UIStackView
          ├ UIView
          │   └ UITextField
          ├ UIView
          │   └ UITextField
          └ UIView
              └ UITextField

こういう構造です。
ちなみに、UIStackView に直接 UITextField を入れていくと期待している挙動になるので、ネストが深くなってくると発生するのだろうと思います。

対策

対策は割と簡単で、IQKeyboardManager で管理したい(Prev/Nextで扱いたい)すべての UITextField の共通の親View(直接の親ではなくても)になるものを IQPreviousNextView にする。
言い換えると、管理したい UITextField はすべて IQPreviousNextView 配下のView内にするということです。

UIView
  └ IQPreviousNextView <- 追加
      └ UIScrollView
          └ UIStackView
              ├ UIView
              │   └ UITextField
              ├ UIView
              │   └ UITextField
              └ UIView
                  └ UITextField

こういう感じにViewのツリー構造をかえると...

正常パターン

無事表示されるようになります!💪

参考