2016-06-28 2 views
1

코드를 체계적이고 재사용 가능하게하려고합니다. 키보드가 나타나면 스크롤보기를 위로 이동시키고 키보드가 숨겨지면 아래로 스크롤 할 수 있도록하는 몇 가지 기능과 알림이 있습니다. 그것은 모두 작동합니다. 그러나, 나는 이러한 기능을 이미 UIViewcontroller 내부의 scrollView가있는 프로젝트의 여러 부분에서 사용될 것입니다. 그래서 나는 여러 개의 뷰 컨트롤러에 동일한 코드를 작성하는 것이 아니라 좀 더 resuable 한 코드를 만들고 싶다.신속한 코드 구성 IOS

현재, 내보기 컨트롤러 중 하나 안에, 내가 코드를 더 재사용 할 수 있도록 노력을 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

코드가 앱의 여러 위치에서 재사용 될 수있는 경우 코드를 공유하는 모든보기 컨트롤러에 대한 기본 클래스를 만드는 것이 좋습니다. –

+0

'UIScrollView'와 같은 것에 [클래스 확장] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html)을 만들었습니까? – ZGski

답변

2

내가 프로토콜을 생성하고 프로토콜의 확장으로 기본 구현을 추가하는 것이 좋습니다 것입니다. 프로토콜에 구현하는 클래스에 scrollView와 키보드가 있어야한다고 추가 할 수 있습니다. 프로토콜 확장은 기본 클래스보다 유연하므로 Swift에서 선호되는 경우가 많습니다.

다음은 나중에 쉽게 프로토콜 확장을 사용할 수 없습니다 때문에 대신 addObserver의 addObserverForName을 사용했습니다 염두에

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 
     } 
    } 
} 

가지고 예입니다. 자세한 내용은 여기를 참조하십시오. Swift make protocol extension a Notification observer