ios - 在 tableview 的文本字段中搜索

标签 ios uitableview mvvm uisearchbar

textField 中搜索的tableView .

我需要从 tableView 中搜索名称.所以我有tableViewtextFieldUIViewController .

我需要从 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
    }
}

我的 View 模型:-
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 {

        @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
     }
}

这是我的代码。现在如何在这里实现搜索。

最佳答案

没有搜索的方法。

  • 当您输入文本并按 搜索按钮 .
  • 当您键入然后搜索而不使用 搜索按钮 .

  • 1的解决方案:

    您需要在搜索按钮上调用一个方法

    搜索按钮。
    func Search() {
            predicate = NSPredicate(format: "Self.YourSearchListName beginsWith[c]%@", SearchName)
            GetsearchList = YourArrayForSearch.filtered(using: predicate) as NSArray
    
            YourTable.reloadData()
        }
    

    第二种解决方案
     func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
     if textField == self.YourTextFieldName{
        Search()
    }
        }
    

    对于第二个解决方案,不要忘记设置委托(delegate)。

    关于ios - 在 tableview 的文本字段中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50094724/

    相关文章:

    ios - 无法从静态库和包中加载 subview 类和 xib

    ios - 如何使用 MVVM 在 MonoTouch TableView 中绑定(bind)删除按钮

    iphone - 本地化日期不翻译日期

    ios - 在 Metal 中填充 float 缓冲区

    iphone - 半透明导航栏的 iOS 间距问题

    ios - 为 UITableViewCells 使用一堆不同的类是否会严重影响性能?

    ios - 如何实现 UITableView 部分

    c# - 如何使用 UIElement 依赖属性实现 WPF 用户控件?

    c# - 从 View 模型更改Xamarin Forms应用页面

    objective-c - Tableview 图片加载缓慢