2017-09-28 58 views
1

在適應新的iOS 11 UISearchController中的NavigationItem後,我遇到了一些問題。iOS 11上的UIToolbar按鈕無法調用的操作UISearchController

我已將UIBarButtonItem添加到UISearchController的搜索欄的工具欄中。此按鈕在單擊時調用一個函數(作爲UIBarButtonItem構造函數中的動作參數傳遞)。

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

回答

1

首先檢查函數func didPressQRToolbarButton(sender: Any)的發件人。 它應該是這樣的:

func didPressQRToolbarButton(sender: UIBarButtonItem) 

然後,你一定是從Xcode的一些警告,因爲自動@objc推理上雨燕4

棄用因此,在斯威夫特4didPressQRTToolbar或作爲參數傳遞給#selector任何功能:

#selector(didPressQRToolbarButton) 

必須添加@objc其聲明:

@objc func didPressQRToolbarButton(sender: Any) { 
0

的問題是固定通過在UIBarButtonItem構造器傳遞自作爲目標。不知何故,這是iOS 11之前不需要。

此修復以及festeban26的答案解決了問題。

+0

創建欄按鈕項目時,您將'nil'作爲目標。只要傳遞'self'作爲目標,那麼你的代碼將無任何改變地工作。 並且在iOS的所有版本中都需要傳遞目標,否則按鈕將不知道在Tap事件中傳遞的位置和對象。 – Rishi