IQKeyboardManagerでPrev/Nextボタンが表示されない場合の対処方法
ざっくりまとめ。
- IQKeyboardManager を使用していてもキーボード表示時に Prev/Next ボタンが表示されないケースがある。
- ネストが深いView構造をしていると発生するっぽい?
 
- その場合は、対象のTextFieldの共通の親Viewになるものを IQPreviousNextViewにする
です。
IQKeyboardManager とは
キーボード周りをよしなに調整してくれるやつで、
キーボード表示したときに対象の TextField なんかが見えるようにスクロールしてくれたり、
キーボードにツールバーを追加表示させて、完了ボタンやフォーカス移動をしてくれるボタンを設置してくれたりします。
今回はそのフォーカス移動をしてくれるボタンの話です。
環境
- Xcode v10.2.1
- IQKeyboardManager v6.3.0
問題
UIScrollView + UIStackView という構造にして画面を組んでいた時に発生したのですが、
IQKeyboardManager を有効にしているにもかかわらず、キーボードに付属して表示されるツールバーに 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のツリー構造をかえると...

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