iOS 11 UISearchController 上的 UIToolbar 按钮未调用操作

Action not called from UIToolbar button on iOS 11 UISearchController

在适应新的iOS11UISearchControllerNavigationItem,遇到了一些问题

我在 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 4didPressQRTToolbar 或作为参数传递给 #selector 的任何函数:

#selector(didPressQRToolbarButton)

必须在其声明中添加@objc

@objc func didPressQRToolbarButton(sender: Any) {

通过将 self 作为 UIBarButtonItem 构造函数中的目标来解决问题。在 iOS 11.

之前不需要这样做

此修复与 festeban26 的回答一起解决了问题。