gpt4 book ai didi

iOS - 如何在点击 UIView 的任意位置时从 navigationItem.searchController 中关闭键盘?

转载 作者:行者123 更新时间:2023-11-28 10:07:08 25 4
gpt4 key购买 nike

我已经实现了新的 SearchController 及其 searchBarsearchResultsController

我是这样实现的:

结果 View Controller :

lazy var resultViewController: SearchResultViewController = {
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let searchResultViewController = storyboard.instantiateViewController(withIdentifier: "SearchResultViewController") as! SearchResultViewController
searchResultViewController.delegate = self
return searchResultViewController
}()

这是搜索 Controller :

lazy var searchController: UISearchController = {
let searchController = UISearchController(searchResultsController: resultViewController)
searchController.searchBar.delegate = self
searchController.obscuresBackgroundDuringPresentation = true
searchController.searchResultsUpdater = self
searchController.searchBar.placeholder = "Search.city.label".localizable()
searchController.searchBar.tintColor = UIColor.white
searchController.searchBar.barTintColor = UIColor.white
UITextField.appearance(whenContainedInInstancesOf: [type(of: searchController.searchBar)]).tintColor = UIColor(red:0.00, green:0.47, blue:0.78, alpha:1.0)

if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {
if let backgroundview = textfield.subviews.first {

// Background color
backgroundview.backgroundColor = UIColor.white

// Rounded corner
backgroundview.layer.cornerRadius = 10;
backgroundview.clipsToBounds = true;
}
}

definesPresentationContext = true
return searchController
}()

在我的 viewWillAppear 中,我设置了 navigationItem.searchController :

self.searchController.isActive = true

if #available(iOS 11.0, *) {
self.navigationItem.searchController = searchController
self.navigationItem.hidesSearchBarWhenScrolling = true
} else {
// Fallback on earlier versions
}

我已经能够处理 cancelButtonClicked 了:

extension HomeViewController: UISearchBarDelegate {

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.endEditing(true)
self.searchController.isActive = false
}
}

这是在执行“取消”动画,在 searchBar/searchController 上隐藏键盘 + 非事件状态。同时点击取消按钮 1 次。

但是当用户点击 View 上的任意位置时,我无法实现这一点。

我尝试使用点击手势,但它需要我点击 2 次才能实现相同的行为。

注意:

我的 UIViewController 中有一个 UICollectionView,它占据了 UIView 中的所有位置。

这是我尝试过的:

override func viewDidLoad() {
super.viewDidLoad()
handleTapAnywhereToRemoveKeyboard()
}


func handleTapAnywhereToRemoveKeyboard() {
let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.singleTap(sender:)))
//singleTapGestureRecognizer.numberOfTapsRequired = 1
singleTapGestureRecognizer.cancelsTouchesInView = false
self.view.addGestureRecognizer(singleTapGestureRecognizer)
}

@objc func singleTap(sender: UITapGestureRecognizer) {
self.searchController.isActive = false
self.searchController.searchBar.resignFirstResponder()
self.searchController.searchBar.endEditing(true)
}

编辑:

我在想,也许是因为我的 searchBar 和 searchController 不在 UIViewController 的 View 层次结构中,而是在 NavigationController 的 View 层次结构中。

所以我也尝试过:

navigationController?.view.endEditing(true)

然后我在想,也许是因为我的 UICollectionView 中的 UIScrollView 正在捕捉水龙头。所以我尝试在 UICollectionView 而不是 UIView 上链接点击手势,但没有成功。

最佳答案

不需要像上面建议的那样添加UITapGestureRecognizerUIViewContoller 已经符合 UIResponder 接口(interface)(Objective C 遗留的),因此您可以像这样覆盖此方法:

extension UIViewController {

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.window?.endEditing(true)
super.touchesEnded(touches, with: event)
}

}

关于iOS - 如何在点击 UIView 的任意位置时从 navigationItem.searchController 中关闭键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52035185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com