поиск по таблице с помощью mvvm - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно искать в табличном представлении. У меня есть табличное представление и текстовое поле. При щелчке по текстовому полю оно должно искать табличное представление.

моя модель: -

     class SearchModel: NSObject {


 var restaurantname :String!


    init?(dictionary :JSONDictionary) {

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

        self.restaurantname = name

    }



}

моя viewmodel: -

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)

                //   }
            }




        }}
}

моя модель источника данных: -

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, UISearchBarDelegate,UITextFieldDelegate {


    @IBOutlet private weak var tableView: UITableView!
  !
    @IBOutlet weak var txt: UITextField!

    var filteredSearchArray = NSMutableArray()



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



    var filteredData: [String]!



    override func viewDidLoad() {
        super.viewDidLoad()




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



        searchViewModel.loadData { (isSuccess) in


            if(isSuccess == true)
            {


                self.tableView .reloadData()


            }
            else{


                }
        }



    }


    @objc private func textFieldDidChange(textField: UITextField) {
        if textField.text == "" {
           self .viewDidLoad()
        }else{
            filterContentForSearchText(searchText: textField.text!)
        }
    }



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


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



        return cell
    }


}

моя ячейка просмотра таблицы: -

class SearchCell: UITableViewCell {




  @IBOutlet weak var name: UILabel!


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

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

        // Configure the view for the selected state
    }


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


    }
}

Это мой код, но в FilterSearchArray всегда отображается как элемент 0.

Здесь отображается список имен, но при щелчке по текстовому полю он не ищет и не перезагружает. Как решить проблему.

Данные не поступают в этот код: -

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

1 Ответ

0 голосов
/ 03 мая 2018

Прежде всего, одна важная вещь: не используйте NSArray, NSDictionary в swift, используйте Array, Dictionary.

Я изменил класс вашей модели:

class SearchModel: NSObject {
    var restaurantname :String!
    init(dictionary :JSONDictionary) {
        self.restaurantname = dictionary["name"] as? String ?? ""
    }
}

Теперь отфильтруйте ваш массив так:

filteredSearchArray = searchViewModel.datasourceModel.dataListArray?.filter {$0.restaurantname.lowercased().contains(searchText.lowercased())}

А теперь передайте filteredSearchArray в tableView источник данных и перезагрузите таблицу. Вы можете взять bool переменную isSearching, чтобы проверить, какой массив вы должны передать в источник данных отфильтрованного оригинала. Переключите этот isSearching в textFieldDidBeginEiditng и textFieldDidEndEiditng метод.

Я проверил это на примере ниже на моей игровой площадке:

var models: Array<SearchModel> = [SearchModel.init(dictionary: ["name": "Khalsa Dhaba"]), SearchModel.init(dictionary: ["name": "Yo! China"]), SearchModel.init(dictionary: ["name": "Sher-e-punjab"]), SearchModel.init(dictionary: ["name": "Haveli"])]
let result = models.filter {$0.restaurantname.lowercased().contains("o!".lowercased())}
print(result)

Работает отлично! Во-вторых, я заметил, что вы перезагружаете свое представление, вызывая метод self.viewDidLoad(), который вы не должны вызывать никогда, он вызывает сам себя, и это функция жизненного цикла viewContoller. Позвоните tableView.reloadData() вместо.

...