2016-06-28 14 views
1

私は自分のコードをより整理して再利用可能にしようとしています。キーボードが表示されているときにスクロールビューを上に移動させ、キーボードを非表示にしたときにスクロール表示をスクロールできるようにする関数と通知があります。それはすべて機能している。しかし、私はこれらの関数をイメージすることはUIViewcontrollerの内部にscrollViewを持つ私のプロジェクトの複数の部分で使用されます。だから私は、複数のView Controllerに同じコードを書くのではなく、より再現可能なコードを作成したいと思っています。素早くコードを整理してください。IOS

現在、私のビューコントローラの1の内側に、私は、コードをより再利用可能にしようとするABIT新しいです

var keyboard = CGRect() 

override func viewDidLoad() { 

    // Check notifications of keyboard activity 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PostVC.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PostVC.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil) 

    // Tap to hide keyboard 
    let hideTap = UITapGestureRecognizer(target: self, action: #selector(PostVC.hideKeyboard)) 
    hideTap.numberOfTapsRequired = 1 
    self.view.userInteractionEnabled = true 
    self.view.addGestureRecognizer(hideTap) 
} 

func hideKeyboard() { 
     self.view.endEditing(true) 
    } 


func keyboardWillShow(notification: NSNotification) { 

    keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRectValue())! 

    UIView.animateWithDuration(0.4) { 
     self.scrollView.contentSize.height = self.view.frame.size.height + self.keyboard.height/2 + UITabBarController().tabBar.frame.size.height 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 

    UIView.animateWithDuration(0.4) { 
     self.scrollView.contentSize.height = 0 
    } 
} 

を持っています。私は新しいクラスを作成するか、UIViewControllerの拡張を作成してそこに配置する必要があるかどうかはわかりません。私はのUIViewControllerの拡張を作成しようとした

func keyboardWillShow(notification: NSNotification, _scrollView: UIScrollView) { } 

ような何かを行うとscrollviewのインスタンスを渡しています:関数に(@IBOutlet弱いのvar scrollView UIScrollViewの!)。しかし、その後、私は#selector(keyboardWillShow(_:, keyboard: keyboard, scrollView: scrollView)で問題に遭遇します。それは私に式のリストの期待される表現を言っているエラーを与えます(私はそれは_について不平を言っていると思います)。私はこれを行うのに間違った道にいるかもしれない。誰でも助けてもらえますか?

おかげで、

+1

コードをアプリのさまざまな場所で再利用できる場合は、コードを共有するすべてのView Controllerの基本クラスを作成することをお勧めします。 –

+0

あなたは 'UIScrollView'のようなものについて[クラス拡張](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html)を作成しましたか? – ZGski

答えて

2

私はプロトコルを作成し、プロトコル拡張として、デフォルトの実装を追加することをお勧めします。プロトコルには、それを実装するクラスにscrollViewとキーボードが必要であることを追加できます。プロトコル拡張は基本クラスよりも柔軟性があることを覚えておいてください。そのため、Swiftではしばしば好まれています。ここで

は一例であり

protocol Scrollable : class { 

    var scrollView: UIScrollView { get } 
    var keyboardRect: CGRect { get set } 
} 

extension Scrollable where Self : UIViewController { 

    func registerForKeyboardNotifications() { 

     NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillShowNotification, object: nil, queue: nil, usingBlock: { (notification) in 

      self.keyboardWillShow(notification) 
     }) 
     NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillHideNotification, object: nil, queue: nil, usingBlock: { (notification) in 

      self.keyboardWillHide(notification) 
     }) 
    } 

    func deregisterForKeyboardNotification() { 

     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func keyboardWillShow(notification: NSNotification) { 

     self.keyboardRect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRectValue())! 

     UIView.animateWithDuration(0.4) { 
      self.scrollView.contentSize.height = self.view.frame.size.height + self.keyboardRect.height/2 + UITabBarController().tabBar.frame.size.height 
     } 
    } 

    func keyboardWillHide(notification: NSNotification) { 

     UIView.animateWithDuration(0.4) { 
      self.scrollView.contentSize.height = 0 
     } 
    } 
} 

後には簡単にプロトコル拡張で使用することはできませんので、私は代わりにaddObserverのaddObserverForNameを使用していた心を持っています。その詳細については、こちらをご覧ください。Swift make protocol extension a Notification observer

関連する問題