【问题标题】:Send data from TableView to DetailView Swift even if it not on UITableList将数据从 TableView 发送到 DetailView Swift,即使它不在 UITableList 上
【发布时间】:2018-10-26 00:13:34
【问题描述】:

每当用户在搜索栏中键入名称并且该名称在我的 JSON 上并显示在 UITableView 中时,我可以单击该名称并将字符串传递给我的另一个视图控制器。但是现在,我还想保存并传递搜索到的名称,即使它不在我的 JSON 上。这样,用户可以搜索他们想要的任何“药物”名称,如果该名称不在我的 JSON 列表中,它仍然会被保存并传递给我的另一个视图控制器。

这是我的 tableView 的代码:

import UIKit
import SwiftyJSON

class rxListTableViewController: UITableViewController {
    let searchController = UISearchController(searchResultsController: nil)
    let rxlist = try! JSON(data: NSData(contentsOfFile: Bundle.main.path(forResource: "rxList01", ofType: "json")!)! as Data)
    var filteredRxList = [JSON]()

    override func viewDidLoad() {
        self.tableView.backgroundColor = UIColor.lightGray
        super.viewDidLoad()
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar
        tableView.setContentOffset(CGPoint(x: 0, y: searchController.searchBar.frame.size.height), animated: false)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationItem.hidesSearchBarWhenScrolling = false
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        searchController.isActive = true
        navigationItem.hidesSearchBarWhenScrolling = true
    }

    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cell.backgroundColor = UIColor.clear
    }

    // MARK: - Table view data source
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if isFiltering(){
            return filteredRxList.count
        }
        return rxlist.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "rxCell", for: indexPath)

        var data: JSON

        if searchController.isActive && searchController.searchBar.text != "" {
            data = filteredRxList[indexPath.row]
            let countryName = data["term"].stringValue

            cell.textLabel?.text = countryName
        }else{
            data = rxlist[indexPath.row]
            tableView.reloadData()
        }

        return cell
    }

    func filteredContentForSearchText(searchText: String){
        filteredRxList = rxlist.array!.filter { country in
            return country["term"].stringValue.localizedLowercase.contains(searchText.localizedLowercase)
        }
        tableView.reloadData()
    }

    func searchBarIsEmpty() -> Bool{
        return searchController.searchBar.text?.isEmpty ?? true
    }

    func isFiltering() -> Bool{
        return searchController.isActive && !searchBarIsEmpty()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "moreinfo"{
            if let indexPath = tableView.indexPathForSelectedRow{
                let data: JSON
                if isFiltering(){
                    data = filteredRxList[indexPath.row]
                }else{
                    data = rxlist[indexPath.row]
                }
                let controller = segue.destination as? medDetailsViewController
                let final = data["term"].stringValue
                controller?.name = final
                controller?.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller?.navigationItem.leftItemsSupplementBackButton = true
            }
        }
    } 
}

extension rxListPetsTablViewController: UISearchResultsUpdating{
    func updateSearchResults(for searchController: UISearchController) {
        filteredContentForSearchText(searchText: searchController.searchBar.text!)
    }
}

这是我的 viewController 代码:

import UIKit

class medDetailsViewController: UIViewController {
    @IBOutlet weak var lbl: UILabel!
    var name = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        lbl.text = "\(name) "
    }

有没有办法实现这个请求?

【问题讨论】:

    标签: ios json swift uitableview


    【解决方案1】:

    在您的下一个视图控制器中,创建一个可选的字符串变量并传递值“searchController.searchBar.text!”。例如,在您的准备方法中,添加以下代码:

    let controller = segue.destination as? medDetailsViewController
    controller.searchText = searchController.searchBar.text!
    

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 2013-10-27
      • 2014-11-27
      • 2023-04-09
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 2017-01-11
      • 2013-03-30
      相关资源
      最近更新 更多