2016-10-05 3 views
4

키보드가 팝업되는 다른 viewController에 여러 textField가 있습니다.전체 앱에서 터치했을 때 키보드를 닫는 방법

사용자가 화면의 다른 부분을 클릭 할 때 키보드를 닫는 방법을 알고 있지만 앱의 모든 구석에 하드 코드를 넣고 싶지 않습니다.

그래서 키보드는 사용자가 키보드이 아닌 다른 화면의 아무 곳이나 을 클릭하면 키보드가 응용 프로그램에 사방 을 기각지고 시행 어쨌든 무엇입니까?

나는 UIViewController를 확장하려고 생각했지만, 서브 뷰로 추가 한 뷰에는 textFields도있다. 아마도 TextField 클래스 자체를 확장 할 수도 있습니다.

답변

4

UIViewController을 만들고 각 ViewController에서 상속하도록하는 것이 좋습니다. 다음과 같이

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    view.endEditing(true) 
} 

또는 당신은 기본 ViewController- -in 에게 viewDidLoad에을 무시할 수 있고,보기에 UITapGestureRecognizer를 추가 : 그것에 touchesBegan 메소드를 오버라이드 (override)

override func viewDidLoad() { 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(Base.endEditing)) 
    view.addGestureRecognizer(tapGesture) 
} 

func endEditing() { 
    view.endEditing(true) 
} 
+2

비용을 들이지 않고 Swift Extensions를 통해이 작업을 수행 할 수도 있습니다. 모든 UIViewController를 리팩토링 할 필요가 없습니다. – midori

+0

버튼이있는 viewController가 있다고 가정 해 보겠습니다. 그리고 분명히 viewController의 하위 뷰인 버튼을 탭합니다. 그런 다음 viewController가 더 이상 메시지를 보내지 않으므로 키보드가 여전히 있습니다. 내가 맞습니까? – Honey

+0

버튼을 두드리는 것은 touchesBegan을 호출하지 않습니다. 버튼의 동작에 "view.endEditing (true)"를 추가하여이 문제를 해결할 수 있습니다 ... @IBAction func buttonTapped (보낸 사람 : AnyObject) { view.endEditing (true) } –

3

을 또한 사용할 수 있습니다 키보드 해고를 모든 사용자에게 적용하려면보기 컨트롤러의 확장입니다.

extension UIViewController { 
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true) 
    } 
} 
관련 문제