Is it possible to have UISearchBarDelegate extension in separate file?

901 Views Asked by At
extension HomeViewController: UISearchBarDelegate {


    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        //code
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
         //code     
    }
}

This was working fine when it was at the bottom of my HomeViewController.
I wonder if I can separate this extension in separate file?

3

There are 3 best solutions below

1
faris97 On BEST ANSWER

I forgot to include UIKit.

import Foundation
import UIKit

extension HomeViewController {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)        {
      //code
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
     //code
    } 
}

Also, you need to inherit UISearchBarDelegate in ViewController, not in extension.

0
eemrah On

You can achieve this like below.

viewDidLoad(){
  let searchBar = UISearchBar()
  searchBar.delegate = DelegateFile()
}

create a file.

class DelegateFile: NSObject, UISearchBarDelegate{
    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        //
    }
}

Then implement your delegate methods in the seperate file.

0
NøBi Mac On

Yes it is possible.

Hope you know about extention in swift.

Extensions is useful feature that helps in adding more functionality to an existing Class, Structure, Enumeration or a Protocol type. This includes adding functionalities for types where you don’t have the original source code.

Code:

class HomeVC: UIViewController {

    var searchBar = UISearchBar()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.searchBar.delegate = self   
    }
}

create another file named HomeVC+SearchBarDelegate

import Foundation
import UIKit

extension HomeVC: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        //code
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
         //code
    }
}

I hope this will help you.

Thank you