現在、ログインとサインアップフォームを使用してiOSアプリケーションを開発中です。キーボードがUITextField
をカバーしていないことを確認するために、Appleで提供され、issueで説明されている以下のソリューションを実装しました。スクロールでスクロールビュープロトコルを作成する2.2
は簡単にそれを要約すると、このソリューションは、要素を上に移動するために、異なるUI要素が配置されるUIScrollView
とUIKeyboardDidShowNotification
とUIKeyboardDidHideNotification
を使用し、ダウンキーボードが表示されたときにUITextField
sが隠されないように/消えます。
これは一つのことを除いて魅力的です:すべて私のUIViewController
のために私は同じコードを繰り返さなければなりません。私の問題に取り組むために私が試してみました:
- をベース
UIViewController
を作成するために、他のUIViewController
Sによってサブクラス可能な機能のための実装を提供します。 - プロトコルとプロトコル拡張を使用して、さまざまな機能のデフォルト実装を提供し、
UIViewController
がそれに準拠するようにします。
両方の解決方法で問題が解決されませんでした。最初の解決策として、宣言されていたにもかかわらず、私の基本クラスのUIScrollView
をInterface Builderで接続することができませんでした。第二の溶液を実装しようとすると
@IBOutlet weak var scrollView: UIScrollView!
、UIViewController
が宣言されたメソッドとその実装を認識しなかった何とか私のプロトコルを実装します。
プロトコル宣言:
protocol ScrollViewProtocol {
var scrollView: UIScrollView! { get set }
var activeTextField: UITextField? { get set }
func addTapGestureRecognizer()
func singleTapGestureCaptured()
func registerForKeyboardNotifications()
func deregisterForKeyboardNotifications()
func keyboardWasShown(notification: NSNotification)
func keyboardWillBeHidden(notification: NSNotification)
func setActiveTextField(textField: UITextField)
func unsetActiveTextField()
}
プロトコル拡張は、私が@objc
を使用して避けたいとすべての機能がaddTapGestureRecognizer()
のために期待を実装:
extension ScrollViewProtocol where Self: UIViewController {
// The implementation for the different functions
// as described in the provided links expect for the following method
func registerFromKeyboardNotifications() {
NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardDidShowNotification, object: nil, queue: nil, usingBlock: { notification in
self.keyboardWasShown(notification)
})
NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardDidHideNotification, object: nil, queue: nil, usingBlock: { notification in
self.keyboardWillBeHidden(notification)
})
}
}
誰もが私の問題に良い解決策を持っていますキーボードが表示されたり消えたりするときに、UITextField
を上下に動かすことに関連したコードを繰り返すのを避けることができますか?それとも誰かが私のソリューションがうまくいかなかった理由を知っていますか?