user3354144
user3354144

Reputation: 11

UISearchBarDelegate methods not being called

I had a working search bar and out of nowhere I stopped being able to even to activate any delegate methods. I created the search bar programmatically.

Here is my initialization code:

    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])

Here is the getImageWithColor method I referenced above:

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
}

And I continue to customize the textField inside the searchBar:

    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

And all my delegate methods:

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()
}
}

Here is also an image from my interface capture of my navigation bar with the search bar:

Screen Capture Image

Screen Capture Image as seen in Interface Capture: View names from front to back: UITextFieldBorderView, UISearchBarTextField, UIView, UISearchBar

Note I'm not sure what the UIView right before the UISearchBar is for

I understand there are a lot of questions on SO about why others can't access their UISearchBar delegate methods. None of those solutions have worked for me. Why can't I access my delegate methods thus far?

Upvotes: 1

Views: 2074

Answers (1)

PakitoV
PakitoV

Reputation: 2498

If none of the delegate methods are working my guess is that your searchBarDelegate is being deallocated for some reason, it is hard to tell without seeing the whole code, but be sure to keep a strong reference to whoever is your searchBarDelegate, because the delegate itself is weak meaning if no one else is retaining it it could be deallocated and thus there is no delegate to respond to the calls.

Upvotes: 1

Related Questions