iOS 11 UISearchController 上的 UIToolbar 按钮未调用操作
Action not called from UIToolbar button on iOS 11 UISearchController
在适应新的iOS11UISearchController
后NavigationItem
,遇到了一些问题
我在 UISearchController
的搜索栏的工具栏中添加了 UIBarButtonItem
。单击此按钮时会调用一个函数(作为 UIBarButtonItem
构造函数中的操作参数传递)。
在 iOS 11 之前,搜索栏已附加到 tableHeaderView
,这非常有效(并且仍然有效)。单击按钮时调用该函数。
但是,在 iOS11 中,即使实现相同,也不会调用该函数。
有什么想法是错误的吗?或者是 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
}
首先,检查函数func didPressQRToolbarButton(sender: Any)
的发件人。
应该是这样的:
func didPressQRToolbarButton(sender: UIBarButtonItem)
那么,您一定是从 xCode 那里得到了一些警告,因为 自动 @objc 推理在 Swift 4.
上被弃用了
因此,在 Swift 4、didPressQRTToolbar
或作为参数传递给 #selector
的任何函数:
#selector(didPressQRToolbarButton)
必须在其声明中添加@objc
:
@objc func didPressQRToolbarButton(sender: Any) {
通过将 self 作为 UIBarButtonItem
构造函数中的目标来解决问题。在 iOS 11.
之前不需要这样做
此修复与 festeban26 的回答一起解决了问题。
在适应新的iOS11UISearchController
后NavigationItem
,遇到了一些问题
我在 UISearchController
的搜索栏的工具栏中添加了 UIBarButtonItem
。单击此按钮时会调用一个函数(作为 UIBarButtonItem
构造函数中的操作参数传递)。
在 iOS 11 之前,搜索栏已附加到 tableHeaderView
,这非常有效(并且仍然有效)。单击按钮时调用该函数。
但是,在 iOS11 中,即使实现相同,也不会调用该函数。
有什么想法是错误的吗?或者是 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
}
首先,检查函数func didPressQRToolbarButton(sender: Any)
的发件人。
应该是这样的:
func didPressQRToolbarButton(sender: UIBarButtonItem)
那么,您一定是从 xCode 那里得到了一些警告,因为 自动 @objc 推理在 Swift 4.
上被弃用了因此,在 Swift 4、didPressQRTToolbar
或作为参数传递给 #selector
的任何函数:
#selector(didPressQRToolbarButton)
必须在其声明中添加@objc
:
@objc func didPressQRToolbarButton(sender: Any) {
通过将 self 作为 UIBarButtonItem
构造函数中的目标来解决问题。在 iOS 11.
此修复与 festeban26 的回答一起解决了问题。