表格视图中的搜索栏将错误数据发送到另一个表格视图

问题描述

enter image description here

我有一个 tableview,其中包含从具有 14 个条目的 Array 馈送的数据。我添加了一个搜索栏,我可以在其中过滤这些数据,这工作正常,但是当我尝试将过滤后的数据发送到第二个表视图时,发送的数据是我过滤后数据的计数。因此,如果我搜索以 G(数组中的第 13 位和第 14 位)开头的内容,则会返回两个结果,这很好,但是当我从过滤数据(两个结果)中选择第一个条目时,传递给第二个表视图是我初始 TVC 的 [0] 条目(A),而不是第 13 个(G12)。因此,根据过滤后的数据,我总是会获得初始数组的前几个条目。

struct ImageForManuf {
           let image: UIImage
           let name: String
           init(nameInit: String) {
               self.name = nameInit
               image = UIImage(named: nameInit)!
           }
       }


     struct SecondTable {
    
    var secondTitle : [String]

    var pic : [UIImage?]
   
}
    
    //for search bar
    @IBOutlet weak var searchBar: UISearchBar!
  
    var filteredData: [ImageForManuf]!
    var searching = false

    var firstArray = [ImageForManuf]()
    //we are adding elements on the SecondTable structure
    var secondArray = [SecondTable]()

 override func viewDidLoad() {
        super.viewDidLoad()
        
        //for search bar
        searchBar.delegate = self
        filteredData = firstArray
        

        firstArray = [ "A","A2","B3","B4","B5","C6","C7","D8","E9","F10","F11","G12","G13","H14",].map(ImageForManuf.init(nameInit:))
        filteredData = firstArray



secondArray = [SecondTable(secondTitle: ["A1"],pic: [UIImage(named: "A1")]),SecondTable(secondTitle: ["B1","B2","B3"],pic: [UIImage(named: "B1"),UIImage(named: "B2"),UIImage(named: "B3")]),SecondTable(secondTitle: ["C1","C2"],pic: [UIImage(named: "C1"),pic: [UIImage(named: "C2")]),SecondTable(secondTitle: ["D1"],pic: [UIImage(named: "D1"),SecondTable(secondTitle: ["E1"],pic: [UIImage(named: "E1"),SecondTable(secondTitle: ["F1","F2"],pic: [UIImage(named: "F1"),pic: [UIImage(named: "F2")]),SecondTable(secondTitle: ["G1","G2"],pic: [UIImage(named: "G1"),pic: [UIImage(named: "G2")]),SecondTable(secondTitle: ["H1"],pic: [UIImage(named: "H1")

]

这是我的电视配置

override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation,return the number of rows
            if searching
            {
               return filteredData.count
            }else{
               return firstArray.count
            }
    }
    
        override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let Cell = tableView.dequeueReusableCell(withIdentifier: "Cell",for: indexPath) as! TableTableViewCell

        Cell.textLabel?.textColor = .systemBlue
        Cell.textLabel?.font = .boldSystemFont(ofSize: 20)
        
            if searching
            {
                Cell.textLabel?.text = filteredData[indexPath.row].name
                Cell.imageManuf?.image = filteredData[indexPath.row].image

            }else{
                Cell.textLabel?.text = firstArray[indexPath.row].name
                Cell.imageManuf?.image = filteredData[indexPath.row].image
            }
        
        
        return Cell
        
    }

    
        //we need to create a variable that can hold the destination view controller
       override func prepare(for segue: UIStoryboardSegue,sender: Any?) {


 if searching {
let row = self.tableView?.indexPathForSelectedRow?.row ?? 0
            let destViewController = segue.destination as! SecondTableViewController var secondTableArray : SecondTable
            secondTableArray = secondArray[row]
            destViewController.secondTableVcArray = secondTableArray.secondTitle
            destViewController.detailVcArray = thirdArray[row]
        }else{
            let row = self.tableView?.indexPathForSelectedRow?.row ?? 0
            let destViewController = segue.destination as! SecondTableViewController
            
            var secondTableArray : SecondTable
            secondTableArray = secondArray[row]
            secondTableArray created in SecondTableViewController
            destViewController.secondTableVcArray = secondTableArray.secondTitle
            destViewController.detailVcArray = thirdArray[row]
            
        }
 
    }

最后这是我的搜索栏配置

 //Mark: Search Bar config
    func searchBar(_ searchBar: UISearchBar,textDidChange searchText: String) {

        filteredData = firstArray.filter({$0.name.lowercased().prefix(searchText.count) == searchText.lowercased()})

        searching = true

        
        
        //to reload the data
        self.tableView.reloadData()
    }
    
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searching = false
        searchBar.text = ""
        tableView.reloadData()
    }

这是第二个电视广告:

class SecondTableViewController: UITableViewController {

    //we are loading the secondArray via the secondTableVcArray
    var secondTableVcArray = [String]()
    //we are loading the thirdArray via the detailVcArray
    var detailVcArray : [DetailView]?


    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return secondTableVcArray.count
    }
    
    override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "secondCell",for: indexPath) as! SecondTableViewCell
       
        
        cell.textLabel?.textColor = .white
        cell.textLabel?.font = .boldSystemFont(ofSize: 20)

        //we load the data of the secondTableVcArray to our cell
        cell.textLabel?.text = secondTableVcArray[indexPath.row]
        
        return cell
    }

    override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
        guard let row = self.tableView?.indexPathForSelectedRow?.row else {
            print("Error: problem with second table view or selection")
            return
        }
        guard let dest = segue.destination as? DetailsViewController else {
            print("Error: couldn't find expected DetailsViewController")
            return
        }
        guard let details = detailVcArray else {
            print("Error: data not set for SecondTableViewController")
            return
        }
        dest.displayDetail = details[row]

        
    }


   

}

有人可以帮助我的 prepareforSeque 方法的行元素并建议有关如何按照@vadian 建议获取我的 firstArray 的 indexPath 的语法吗?第二个条件工作正常(不搜索),但我似乎无法在搜索条件中从我的数据源中提取正确的项目。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)