在适应UISearchController
中的新iOS 11 NavigationItem
后,我遇到了一些问题。
我在UIBarButtonItem
的搜索栏的工具栏中添加了UISearchController
。单击此按钮会调用一个函数(作为UIBarButtonItem
构造函数中的action-parameter传递)。
在iOS 11之前,搜索栏已附加到tableHeaderView
,这完美地工作(并且仍然有效)。单击按钮时会调用该函数。
但是,在iOS 11中,即使实现相同,也不会调用该函数。
任何想法都可能出错?或者是iOS 11中的错误?
private func setupSearchController() {
...
let toolbar = UIToolbar()
toolbar.sizeToFit()
// Create bar button item with image.
let qrBarButton = UIBarButtonItem(image: #imageLiteral(resourceName: "QR Code"), style: .plain, target: nil, action: #selector(didPressQRToolbarButton))
// Add the new button.
toolbar.items = [qrBarButton]
searchController.searchBar.inputAccessoryView = toolbar
// If the device is on iOS 11, use the "native" search bar placement.
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
// Don't use the large title in the navigation bar.
navigationController?.navigationBar.prefersLargeTitles = false
} else {
// Handled in subclasses.
}
}
/// Action for the QR toolbar button
func didPressQRToolbarButton(sender: Any) {
...
// NOT CALLED
}
答案 0 :(得分:1)
首先,检查函数func didPressQRToolbarButton(sender: Any)
的发件人。
它应该是这样的:
func didPressQRToolbarButton(sender: UIBarButtonItem)
然后,您必须从xCode获得一些警告,因为在Swift 4上不推荐使用自动@objc推理。
所以,在 Swift 4 ,didPressQRTToolbar
或作为参数传递给#selector
的任何函数:
#selector(didPressQRToolbarButton)
必须在声明中添加@objc
:
@objc func didPressQRToolbarButton(sender: Any) {
答案 1 :(得分:1)
通过将self作为UIBarButtonItem
构造函数中的目标来解决问题。不知何故,在iOS 11之前不需要这样做。
这个修复以及festeban26的答案解决了这个问题。