您可以创建一个BaseViewController,并在其视图中添加一个点击手势识别器,然后确定点击了哪个子视图,如下所示:
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewDidTap(_:)))
tapRecognizer.delegate = self
tapRecognizer.cancelsTouchesInView = false
self.view.addGestureRecognizer(tapRecognizer)
}
@objc func viewDidTap(_ recognizer: UITapGestureRecognizer) {
guard let view = recognizer.view else { return }
let location = recognizer.location(in: view)
let subview = view.hitTest(location, with: nil)
self.log(tappedView: subview ?? view)
}
func log(tappedView: UIView) {
// do some base job with the tapped view
}
}
extension BaseViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
let location = gestureRecognizer.location(in: self.view)
guard let textField = self.view.hitTest(location, with: nil) as? UITextField else { return false }
textField.becomeFirstResponder()
return true
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以扩展其他视图控制器以具有BaseViewController功能并覆盖该log方法,如下所示:
class ChildViewController: BaseViewController {
let forgotButton = UIButton()
let signinButton = UIButton()
override func log(tappedView: UIView) {
super.log(tappedView: tappedView)
if (tappedView === self.forgotButton) {
labelLog.text = "Forgot button was tapped"
} else if (tappedView === self.signinButton) {
labelLog.text = "Sign In button was tapped"
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |