2017-04-12 78 views
0

我有一個工作搜索欄,無處不在,我甚至無法激活任何委託方法。我以編程方式創建了搜索欄。UISearchBarDelegate方法不被調用

這裏是我的初始化代碼:

self.searchBar.delegate = self 
    self.searchBar.translatesAutoresizingMaskIntoConstraints = false 
    self.searchBar.searchBarStyle = .minimal 
    self.searchBar.isUserInteractionEnabled = true 
    let image = self.getImageWithColor(color: UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 0.19), size: CGSize(width: self.customNavBar.frame.width * 0.9440, height: self.customNavBar.frame.height * 0.47727)) 
    searchBar.setSearchFieldBackgroundImage(image, for: .normal) 
    self.customNavBar.addSubview(self.searchBar) 
    var horizCenter = NSLayoutConstraint(item: self.searchBar, attribute: .centerX, relatedBy: .equal, toItem: self.customNavBar, attribute: .centerX, multiplier: 1, constant: 0) 
    var vertConstraints = NSLayoutConstraint(item: self.searchBar, attribute: .top, relatedBy: .equal, toItem: self.customNavBar, attribute: .top, multiplier: 1, constant: 30) 
    var widthConstraint = NSLayoutConstraint(item: self.searchBar, attribute: .width, relatedBy: .equal, toItem: self.customNavBar, attribute: .width, multiplier: 0.9440, constant: 0) 
    var heightConstraint = NSLayoutConstraint(item: self.searchBar, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: self.customNavBar.frame.height * 0.47727) 
    NSLayoutConstraint.activate([horizCenter, vertConstraints, widthConstraint, heightConstraint]) 

這裏是getImageWithColor方法我上面提到的:

func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { 
    let rect = CGRect(x:0, y:0, width:size.width,height: size.height) 
    let path = UIBezierPath(roundedRect: rect, cornerRadius: 5.0) 
    UIGraphicsBeginImageContextWithOptions(size, false, 0) 
    color.setFill() 
    path.fill() 
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 
    return image 
} 

我繼續自定義搜索欄裏面的文本框:

UITextField.appearance().tintColor = UIColor.white 
    let cancelButtonAttributes: NSDictionary = [NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName : UIFont(name: "Gotham-Book", size: 14.0)!] 
    UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes as? [String : AnyObject], for: UIControlState.normal) 
    let textFieldInsideSearchBar = self.searchBar.value(forKey: "searchField") as? UITextField 
    textFieldInsideSearchBar?.textColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0) 
    textFieldInsideSearchBar?.font = UIFont(name: "Gotham Medium", size: 20.0) 
    textFieldInsideSearchBar?.clearsOnBeginEditing = true 
    textFieldInsideSearchBar?.borderStyle = .none 
    textFieldInsideSearchBar?.clearButtonMode = .whileEditing 
    textFieldInsideSearchBar?.isUserInteractionEnabled = true 

和我所有的代表方法:

extension ListViewController : UISearchBarDelegate { 


func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 

    print("\nfunc searchBarTextDidBeginEditing\n") 
    self.hideDayDropDown() 
    UIView.animate(withDuration: 0.25) { 
     self.dayButton.alpha = 0.0 
     self.dayButtonLabel.alpha = 0.0 
     self.dayDropDownArrow.alpha = 0.0 
     self.mapButton.alpha = 0.0 
     self.mapButton.isEnabled = false 
     self.dayButton.isUserInteractionEnabled = false 
     self.tableView.transform = CGAffineTransform(translationX: 0.0, y: -(self.tableView.frame.minY - self.customNavBar.frame.maxY)) 


     self.tableView.translatesAutoresizingMaskIntoConstraints = true 
     self.tableView.frame = CGRect(x: 0, y: self.customNavBar.frame.maxY, width: self.view.frame.width, height: 300) 

     self.dealOfTheDayLabel.alpha = 0.00 
     self.exploreSpecialView.alpha = 0.0 
     self.exploreSpecialsLabel.alpha = 0.0 


    } 
    searchActive = true 
    self.searchBar.setShowsCancelButton(true, animated: true) 

    UIView.animate(withDuration: 0.25) { 
     self.searchIconImage.alpha = 0.0 
     self.searchIconWhileEditing.alpha = 1.0 
    } 
} 

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { 
    print("\nfunc searchBarTextDidEndEditing\n") 
    UIView.animate(withDuration: 0.25) { 
     self.dayButton.alpha = 1.0 
     self.dayButtonLabel.alpha = 1.0 
     self.dayDropDownArrow.alpha = 1.0 
     self.dayButton.isUserInteractionEnabled = true 

     self.searchIconImage.alpha = 1.0 
     self.searchIconWhileEditing.alpha = 0.0 
     self.tableView.transform = CGAffineTransform(translationX: 0.0, y: 0.0) 

     self.tableView.translatesAutoresizingMaskIntoConstraints = false 
     self.mapButton.alpha = 1.0 
     self.mapButton.isEnabled = true 

     self.dealOfTheDayLabel.alpha = 1.0 
     self.exploreSpecialView.alpha = 1.0 
     self.exploreSpecialsLabel.alpha = 1.0 
    } 
    searchActive = false 
} 

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 
    print("\nfunc searchBarCancelButtonClicked\n") 
    self.searchBar.setShowsCancelButton(false, animated: true) 
    self.searchBar.text = "" 
    self.searchBar.resignFirstResponder() 
    searchActive = false 
    self.searchIconImage.alpha = 1.0 
    self.searchIconWhileEditing.alpha = 0.0 
    self.dayDropDownArrow.alpha = 1.0 
    self.tableView.transform = CGAffineTransform(translationX: 0.0, y: 0.0) 
    self.dealOfTheDayLabel.alpha = 1.0 
    self.exploreSpecialView.alpha = 1.0 
    self.exploreSpecialsLabel.alpha = 1.0 
    tableView.reloadData() 
} 


func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    self.searchResults = self.library.filter({ (bar: BarLibrary) -> Bool in 
     let tmp: String = bar.name! 
     let range = tmp.localizedLowercase.range(of: searchText.localizedLowercase) 
     return range != nil 
    }) 
    if(self.searchResults.count == 0){ 
     searchActive = false 
    } else { 
     searchActive = true 
    } 
    self.tableView.reloadData() 
} 
} 

這裏也是從我的導航欄與搜索欄我的界面捕獲的圖像:

Screen Capture Image

畫面捕獲圖像在接口捕捉看出:從正面視圖名稱向後:UITextFieldBorderViewUISearchBarTextFieldUIViewUISearchBar

注意我不知道什麼是正確的UIView以前UISearchBar是爲

我知道有很多問題關於爲什麼其他人不能訪問他們的UISearchBar委託方法。這些解決方案都沒有爲我工作。爲什麼我目前無法訪問我的委託方法?

+0

如果委託人從未得到調用,請檢查委託方法的簽名。我認爲這是不是一個好的編碼風格來實現您的詳細信息作爲擴展到'ListViewController'類 – muescha

+0

@muescha注意擴展編碼細節。我相信我的委託方法簽名是正確的。 – user3354144

回答

0

如果沒有任何委託方法正在工作,我的猜測是您的searchBarDelegate由於某種原因正在被釋放,很難說沒有看到整個代碼,但一定要保持強烈的引用,無論你是誰searchBarDelegate,因爲委託本身是弱的,如果沒有其他人保留它,它可以被釋放,因此沒有委託來響應這些調用。