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

时间:2017-09-28 07:20:23

标签: ios swift uitoolbar ios11 uisearchcontroller

在适应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
    }

2 个答案:

答案 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的答案解决了这个问题。