Swift 5,iOS 12,Xcode 10

最终,我在ListingsViewController上实现了一个搜索栏,它的工作原理非常好-但是初始数据并未填充到表中。

我意识到这是一个笨拙的实现,但是我正在学习中,并且仅使用我能理解的代码。我已经待了两天了-我尝试过创建Struct并以这种方式引入数据,但是我什至无法获得Array。我曾尝试将其作为NSArray,Array和Object引入,但要么无法加载初始表,要么根本无法解析数据,或者无法获得寻找工作。

我怀疑这与我调用loadData()函数的方式,时间或位置有关,但我无法弄清楚。

class ListingsViewController: UITableViewController, UISearchResultsUpdating {
    var tableData = [String]()
    var filteredTableData = [String]()
    var resultSearchController = UISearchController()
    func updateSearchResults(for searchController: UISearchController) {
        filteredTableData.removeAll(keepingCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let array = (tableData as NSArray).filtered(using: searchPredicate)
        filteredTableData = array as! [String]
        self.tableView.reloadData()
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        tableData = [String]()
        loadData()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.reloadData()
        resultSearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()
            tableView.tableHeaderView = controller.searchBar
            return controller
        })()
        tableView.reloadData()
    }
    func loadData() {
        guard let url = URL(string: "--------------") else {return  }
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let dataResponse = data, error == nil else {
                print(error?.localizedDescription ?? "Response Error")
                return
            }
            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: [])
                guard let jsonArray = jsonResponse as? [[String:Any]] else { return }
                for dic in jsonArray {
                    self.tableData.append(dic["name"] as! String)
                    //                    self.feedItems.append(Listing(id: (dic["id"] as! String), city_id: (dic["city_id"] as! String), category: (dic["category"] as! String), sub_category: (dic["sub_category"] as! String), name: (dic["name"] as! String), phone: (dic["phone"] as! String), email: (dic["email"] as! String), website: (dic["website"] as! String), address: (dic["address"] as! String), comment: (dic["comment"] as! String), recommendedby: (dic["recommendedby"] as! String)))
                }
            } catch let parsingError {
                print("Error", parsingError)
            }
        }
        self.tableView.reloadData()
        task.resume()
    }
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (resultSearchController.isActive) {
            return filteredTableData.count
        } else {
            return tableData.count
        }
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.textColor = .white
        cell.backgroundColor = .black
        cell.tintColor = .lightText
        if (resultSearchController.isActive) {
            cell.textLabel?.text = filteredTableData[indexPath.row]
            return cell
        } else {
            cell.textLabel?.text = tableData[indexPath.row]
            return cell
        }
    }
}


我期望从选项卡栏切换到ListingsViewController时,将显示清单的整个列表。相反,我得到一个空白表。

但是,如果我点击搜索栏并开始输入,则会得到匹配的结果-当我取消搜索时,可以在表格中看到所有结果。

(此外,当我点击搜索栏时,即使取消搜索,导航栏也会消失并且不会返回。即使我切换到其他标签并返回。也无法弄清楚一出)。

最佳答案

您缺少表视图的委托和数据源
添加以下内容:

class ListingsViewController: UITableViewController, UISearchResultsUpdating,UITableViewDelegate,UITableViewDataSource {
//your class code here
}


并在您的viewDidLoad上添加以下内容:

self.tableView.delegate = self
self.tableView.dataSource = self


应该起作用,请注意,在调用委托和数据源之后,将调用行和行数函数的单元格,因此请确保此时使用的数组不为nil

关于ios - TableViewController在搜索时填充,但不会加载初始 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57238168/

10-17 00:52