поиск в текстовом поле таблицы - PullRequest
0 голосов
/ 30 апреля 2018

поиск в textField из tableView.

Мне нужно искать имена из tableView. Так что для этого у меня есть tableView и textField в UIViewController.

И мне нужно искать из API. Для этого я использовал метод Alamofire для получения данных.

Мне нужно искать. Теперь я реализую для отображения имен от API до tableView И я получил вывод. Но мне нужно реализовать поиск. Как это сделать в mvvm.

моя модель: -

class SearchModel: NSObject {
    var restaurantname :String!
    init?(dictionary :JSONDictionary) {

        guard let name = dictionary["name"] as? String  else {
                return
        }
        self.restaurantname = name
    }
}

Моя модель представления: -

class SearchViewModel: NSObject {
        var datasourceModel:SearchDataSourceModel

        init(withdatasource  newDatasourceModel: SearchDataSourceModel) {
            datasourceModel = newDatasourceModel
        }

        func datafordisplay(atindex indexPath: IndexPath) -> SearchModel{
            return  datasourceModel.dataListArray![indexPath.row]
        }

        func numberOfRowsInSection(section:Int) -> Int {
            return (datasourceModel.dataListArray?.count)!
        }

        func loadData(completion :@escaping (_ isSucess:Bool) -> ()){
            loadFromWebserviceData { (newDataSourceModel) in

                if(newDataSourceModel != nil) {
                    self.datasourceModel = newDataSourceModel!
                    completion(true)
                }
                else {
                    completion(false)
                }
            }
        }
        //}

        func loadFromWebserviceData(completion :@escaping (SearchDataSourceModel?) -> ()) {
            //with using Alamofire  ..............
            Alamofire.request("http://www.example.com").validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON{ response in

                switch response.result {
                    case .success(let data):
                        print("success",data)
                        let result = response.result
                        if     let wholedata = result.value as? [String:Any]{


                        if  let data = wholedata["data"] as? Array<[String:Any]>{
                            //  print(data["name"] as! String)
                            print(data)
                            print(response)
                            let newDataSource:SearchDataSourceModel = SearchDataSourceModel(array: data)

                            completion(newDataSource)
                            //       }
                        }
                    }
                    //  case .failure(let data):
                    //  print("fail",data)


                    case .failure(let encodingError ):
                        print(encodingError)
                        //  if response.response?.statusCode == 404 {
                            print(encodingError.localizedDescription)
                            completion(nil)
                    //   }
                }
            }}
    }

мой DataSourcemodel: -

 class SearchDataSourceModel: NSObject {
        var dataListArray:Array<SearchModel>? = []

        init(array :Array<[String:Any]>?) {
            super.init()
            var newArray:Array<[String:Any]> = []
            if array == nil {
             //   newArray = self.getJsonDataStored44()
            }
            else {
                newArray = array!
            }

            var datalist:Array<SearchModel> = []
            for dict in newArray {
                let model = SearchModel(dictionary: dict)
                datalist.append(model!)
            }
            self.dataListArray = datalist
        }
    }

мой класс viewController: -

 class SearchViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

        @IBOutlet private weak var tableView: UITableView!

        private var searchViewModel :SearchViewModel!

        init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, withViewModel viewModel:SearchViewModel) {
            super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
            searchViewModel  = viewModel
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        override func viewDidLoad() {
            super.viewDidLoad()

           //  tableView.dataSource = self
           //  filteredData = data

            searchViewModel.loadData { (isSuccess) in
            if(isSuccess == true) {
                self.tableView .reloadData()
            }
            else {
            }
            }
          //  self.tableView .reloadData()
          // Do any additional setup after loading the view.
        }

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return searchViewModel.numberOfRowsInSection(section: section)
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let identifier = "searchcell"
            var cell: SearchCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? SearchCell

            if cell == nil {
                tableView.register(UINib(nibName: "SearchCell", bundle: nil), forCellReuseIdentifier: identifier)
                cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? SearchCell
            }
           cell.setsearchData(search: searchViewModel.datafordisplay(atindex: indexPath))
           //   cell.name.text = searchViewModel.datafordisplay(atindex: indexPath)
           //  cell.name.text = filteredData[indexPath.row]

           //   cell.setsearchData(search: searchViewModel.datafordisplay(atindex: indexPath))

           return cell
        }

       /*
         // MARK: - Navigation

         // In a storyboard-based application, you will often want to do a little preparation before navigation
         override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         // Get the new view controller using segue.destinationViewController.
         // Pass the selected object to the new view controller.
         }
         */

    }

tableViewCell: -

class SearchCell: UITableViewCell {
   @IBOutlet weak var name: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }


    func setsearchData(search:SearchModel) {
        self.name.text = search.restaurantname
     }
}

Это мой код. Теперь, как реализовать поиск здесь.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

FilterContactListArray - массив, содержащий отфильтрованные данные для перезагрузки табличного представления, когда пользователь начинает поиск определенного текста.

@IBOutlet var searchCityTextField: UITextField!
var filteredSearchArray :SearchViewModel!

в функции Viewdidload ()

searchCityTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)

Метод UItextfieldDelegate

func textFieldDidChange(textField: UITextField) {
        if textField.text == "" {
            filteredSearchArray = searchViewModel// contactListArray is the actual array with all the list of data.
            citiesTableView.reloadData()
        }else{
            filterContentForSearchText(textField.text!)
        }
}

func filterContentForSearchText(searchText: String) {
        filteredSearchArray = NSMutableArray(array:searchViewModel. dataListArray.filter({(ele:AnyObject) -> Bool in
            return (ele as! searchViewModel).cityName.lowercased().contains(searchText.lowercased())
        }))
        citiesTableView.reloadData()
}

Метод UItableviewDelegate

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredContactListArray.count
}
0 голосов
/ 30 апреля 2018

Есть способ поиска.

  1. при вводе текста и нажатии поисковой кнопки .
  2. Когда вы печатаете, тогда ищите без использования кнопки поиска .

Решение для 1:

Вам нужно вызвать метод на кнопке поиска

Кнопка поиска.

func Search() {
        predicate = NSPredicate(format: "Self.YourSearchListName beginsWith[c]%@", SearchName)
        GetsearchList = YourArrayForSearch.filtered(using: predicate) as NSArray

        YourTable.reloadData()
    }

2-е решение

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
 if textField == self.YourTextFieldName{
    Search()
}
    }

для 2-го решения не забудьте установить делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...