首页 > 解决方案 > 如何将信息从嵌入在 ViewController 中的 tableViewController 发送到该视图控制器?

问题描述

我有一个视图控制器,在该视图控制器内我有一个表视图控制器(参见此处的图片)

该程序的工作原理如下:

用户正在键入某人的电子邮件地址,表格视图在用户键入时正在更新。

一旦用户确信表格正在显示他想要的单元格,他就可以单击它,并且来自按下的单元格的信息“自动完成”用户输入的内容。

我有两个视图控制器(一个表视图和一个常规视图)。我知道如何将信息从 viewController 发送到 tableViewController,但我不知道如何反过来。附上viewController的代码:

class PayViewController: UIViewController, STPAddCardViewControllerDelegate {
    
    
    var finalAmount = ""
    var toPay = 0.00
    var successfullPayment = false
    var payToUser = ""
    var updatedBalance = ""
    
    lazy var functions = Functions.functions()
    var resultText = "" // empty
    var input = ""
    var email = ""
    
    var sele = ""
    
    @IBOutlet weak var forField: UITextField!
    @IBOutlet weak var toField: UITextField!
    @IBOutlet weak var amountLabel: UILabel!
    
    //toField.addTarget(self, action: #selector(UsersTableViewController.textChanges(_:)), for: UIControl.Event.editingChanged)
    var myTable:UsersTableViewController?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //var myTable:UsersTableViewController?
        amountLabel.text = "$ \(finalAmount)"
        myTable = self.children[0] as! UsersTableViewController
        self.toField.addTarget(myTable, action: #selector(UsersTableViewController.textChanges(_:)), for: UIControl.Event.editingChanged)
    }

    
    @IBAction func paraFieldEdditingStarted(_ sender: Any) {
         myTable!.filterContent(searchText:forField.text!)
        //self.toField.addTarget(, action: #selector(UsersTableViewController.textChanges(_:)), for: UIControl.Event.editingChanged)
    }

以下是 tableViewController 的代码

class UsersTableViewController: UITableViewController, UISearchResultsUpdating {
    
    func updateSearchResults(for searchController: UISearchController) {
        //update the search results
        filterContent(searchText: searchT)
    }

    
    @objc func textChanges(_ textField: UITextField) {
        let text = textField.text! // your desired text here
        // Now do whatever you want.
        searchT = text
        filterContent(searchText:textField.text!)
    }
    

    @IBOutlet var usersTableView: UITableView!
    let searchController = UISearchController(searchResultsController: nil)
    
    var searchT = ""
    var usersArray = [NSDictionary?]()
    var filteredUsers = [NSDictionary?]()
    
    var databaseRef: DatabaseReference!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
 
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        
        tableView.tableHeaderView = searchController.searchBar
        
        databaseRef = Database.database().reference()
        let usersRef = databaseRef.child("users")
        let query = usersRef.queryOrdered(byChild: "email")
        query.observe(.childAdded, with: {(snapshot) in
            self.usersArray.append((snapshot.value as? NSDictionary?)!)
            
            //insert the rows
            self.usersTableView.insertRows(at: [IndexPath(row:self.usersArray.count-1, section: 0)], with: UITableView.RowAnimation.automatic)
            
            
        }) { (error) in
            print(error.localizedDescription)
        }
        
        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        
        if (self.searchT != ""){
            return filteredUsers.count
        }
        return self.usersArray.count
    }

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

        let user: NSDictionary
        if ((searchT != "")){
            user = filteredUsers[indexPath.row]!
        }else{
            user = self.usersArray[indexPath.row]!
        }

        cell.textLabel?.text = user["email"] as? String
        cell.detailTextLabel?.text = user["name"] as? String
        
        return cell
    }
    
    func filterContent(searchText: String){
        
        self.filteredUsers =  self.usersArray.filter({ user in
            let userEmail = user!["email"] as? String
            return(userEmail?.lowercased().contains(searchText.lowercased()))!
        })
        
        tableView.reloadData()
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //let vc = storyboard?.instantiateViewController(withIdentifier: "ConfirmationVC") as? PayViewController
        //vc?.forField.text = filteredUsers[indexPath.row]!["email"] as! String
    }
    
    func setContents(searchText: String){
       // searchT = searchText
    }

正如您在 tableviewcontroller 的最后看到的那样,我尝试使用 vc 将信息发送回。有没有更简单的方法呢?

标签: iosswiftuitableviewuiviewcontroller

解决方案


你的尝试

let vc = storyboard?.instantiateViewController(withIdentifier: "ConfirmationVC") as? PayViewController

...失败,因为它创建了一个新的、不同的 PayViewController 实例 - 而不是包含此 UsersTableViewController 的实例。

PayViewController 就是这个 UsersTableViewController 的parent。您可能需要将其转换为 PayViewController 才能调用方法或在其中设置属性:

let vc = self.parent as? PayViewController

(请注意,一个视图控制器在您尝试时直接设置另一个视图控制器的界面是不常见的。您应该为 PayViewController 提供一个 UsersTableViewController 可以正常调用的方法。)


推荐阅读