-1

現在、ログインとサインアップフォームを使用してiOSアプリケーションを開発中です。キーボードがUITextFieldをカバーしていないことを確認するために、Appleで提供され、issueで説明されている以下のソリューションを実装しました。スクロールでスクロールビュープロトコルを作成する2.2

は簡単にそれを要約すると、このソリューションは、要素を上に移動するために、異なるUI要素が配置されるUIScrollViewUIKeyboardDidShowNotificationUIKeyboardDidHideNotificationを使用し、ダウンキーボードが表示されたときに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を上下に動かすことに関連したコードを繰り返すのを避けることができますか?それとも誰かが私のソリューションがうまくいかなかった理由を知っていますか?

答えて

0

解決策が見つかりました。私は誰かが一度同じことをするためにそれを投稿します。

私は基本クラスのUIScrollViewアウトレットを削除し、継承クラスで設定した単純なプロパティに置き換えました。次のように私の基本クラスの外観のためのコード:私はこれが役立つことを願っています

class ViewController: ScrollViewController { 

    @IBOutlet weak var scrollViewOutlet: UIScrollView! { 
     didSet { 
      self.scrollView = self.scrollViewOutlet 
     } 
    } 

    // Your view controller functions 

} 

import UIKit 

class ScrollViewController: UIViewController, UITextFieldDelegate { 

    // MARK: Properties 

    var scrollView: UIScrollView! 
    var activeTextField: UITextField? 

    // MARK: View cycle 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let singleTap = UITapGestureRecognizer(target: self, action: #selector(singleTapGestureCaptured)) 
     scrollView.addGestureRecognizer(singleTap) 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     registerForKeyboardNotifications() 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 
     deregisterFromKeyboardNotifications() 
    } 

    // MARK: Gesture recognizer 

    func singleTapGestureCaptured(sender: AnyObject) { 
     view.endEditing(true) 
    } 

    // MARK: Keyboard management 

    func registerForKeyboardNotifications() { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillBeHidden), name: UIKeyboardWillHideNotification, object: nil) 
    } 

    func deregisterFromKeyboardNotifications() { 
     NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
    } 

    func keyboardWasShown(notification: NSNotification) { 
     scrollView.scrollEnabled = true 

     let info : NSDictionary = notification.userInfo! 
     let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
     let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 

     scrollView.contentInset = contentInsets 
     scrollView.scrollIndicatorInsets = contentInsets 

     var aRect : CGRect = self.view.frame 
     aRect.size.height -= keyboardSize!.height 
     if let activeFieldPresent = activeTextField { 
      if (!CGRectContainsPoint(aRect, activeFieldPresent.frame.origin)) { 
       scrollView.scrollRectToVisible(activeFieldPresent.frame, animated: true) 
      } 
     } 
    } 

    func keyboardWillBeHidden(notification: NSNotification) { 
     let info : NSDictionary = notification.userInfo! 
     let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
     let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0) 

     scrollView.contentInset = contentInsets 
     scrollView.scrollIndicatorInsets = contentInsets 

     view.endEditing(true) 
     scrollView.scrollEnabled = false 
    } 

    // MARK: Text field management 

    func textFieldDidBeginEditing(textField: UITextField) { 
     activeTextField = textField 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     activeTextField = nil 
    } 
} 

そしてここでは、継承クラスのコードです!

関連する問題