前提・実現したいこと
Swift5でアプリを開発していますが、奇妙な事が発生しました。
アプリはUICorrectionViewを使用してセルにキーボードやPickerViewでデータを入力するものです。セルにキーボードから入力される場合で、そのセルが隠れる場合は、View(全てのUICorrectionViewを乗せています)全体を上部にキーボードサイズ分移動しています。(PickerViewはセルが隠れない大きさにしているのでViewの移動は無しです)
これに対し、機能強化のためdatePickerをstoryboardでViewの上に追加しました。
そうしたら、最初に初期画面から移動してきた時は、以前と同様に正常な動作をするのですが、そこで、画面の更新をするとキーボード入力時にViewが直ぐに戻ってしまいセルが隠れてしまうようになってしまいました。
発生している問題・エラーメッセージ
下記がその動きです。
左端の数字はログを取るために設定した各モジュールのIDです。
textFieldDidBeginEditingとtextFieldDidEndEditingはtextFieldのdelegate部分です。
textFieldはUICorrectionViewのセルの中に設定されています。
showKeyboardはviewDidLoad内のNotificationCenter.default.addObserverに設定です。
closeKeyboardもviewDidLoad内のNotificationCenter.default.addObserverに設定です。scrollTableCellはshowKeyboard内とcloseKeyboard内でcallします。
scrollTableCellはViewを上げる時も下げる時も呼ばれます。(フラグにより判断)
datePickerについては@IBOutletの変数定義だけです。
異常な点は以下です。
・なぜ、画面更新されるとキーボード入力開始(ID:20)が2回呼ばれるのか?
・なぜキーボード表示された後にレイアウト変更(ID:4)が呼ばれるのか?
更に不可解な事は、下記の後に初期画面に戻り(show)、再度同じ操作をしても画面更新後と同じになってしまう(Viewが直ぐに戻ってしまう)事です。
また、datePickerを追加したから発生していますが、datePickerを使用する画面を全く表示していないのに発生します。
これでは、datePickerを使用できません。どなたかこの原因や退避方法をご存知の方はいらっしゃいませんでしょうか?
該当のソースコード
ソースは多すぎるので、ログを示します。
<初期画面からshowで移動>
0: viewDidLoad()
1: viewWillAppear
4: viewDidLayoutSubviews
6: collectionView( insetForSectionAt section: Int) x 8
4: viewDidLayoutSubviews
20: textFieldDidBeginEditing
6: collectionView( insetForSectionAt section: Int)
7: showKeyboard(_ notification: Notification)
10: scrollTableCell
8: closeKeyboard
10: scrollTableCell
21: textFieldDidEndEditing
6: collectionView( insetForSectionAt section: Int)
30: collectionView(didSelectItemAt indexPath: IndexPath)
<画面の更新>
self.loadView() 実行
self.viewDidLoad 実行
0: viewDidLoad()
4: viewDidLayoutSubviews
6: collectionView( insetForSectionAt section: Int) x 8
20: textFieldDidBeginEditing
20: textFieldDidBeginEditing
6: collectionView( insetForSectionAt section: Int)
7: showKeyboard(_ notification: Notification)
10: scrollTableCell
7: showKeyboard(_ notification: Notification)
10: scrollTableCell
4: viewDidLayoutSubviews
4: viewDidLayoutSubviews
8: closeKeyboard
10: scrollTableCell
8: closeKeyboard
10: scrollTableCell
21: textFieldDidEndEditing
試したこと
viewDidLayoutSubviewsが問題を発生していると思ったので、キーボード入力中は直ぐにreturnするようにしたのですが効果はありませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー