ios - 如何将信息从嵌入在 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 将信息发送回。有没有更简单的方法呢?
解决方案
你的尝试
let vc = storyboard?.instantiateViewController(withIdentifier: "ConfirmationVC") as? PayViewController
...失败,因为它创建了一个新的、不同的 PayViewController 实例 - 而不是包含此 UsersTableViewController 的实例。
PayViewController 就是这个 UsersTableViewController 的parent
。您可能需要将其转换为 PayViewController 才能调用方法或在其中设置属性:
let vc = self.parent as? PayViewController
(请注意,一个视图控制器在您尝试时直接设置另一个视图控制器的界面是不常见的。您应该为 PayViewController 提供一个 UsersTableViewController 可以正常调用的方法。)
推荐阅读
- reactjs - React/Axios 基于键/值合并多个对象数组
- go - 使用“go build”进行交叉编译时提取目标文件时出现问题
- azure - Azure Functions - 按属性名称获取记录
- flutter - Flutter - 设置列表图块高度
- python - PyGame 程序一次只显示一个圆圈
- c++ - 这个错误的原因是什么?循环不会连续运行,它是一个菜单驱动的程序
- java - 将来自 Java API 的 byte[] 渲染为 Angular 2 中的图像
- jsf - 验证失败时,Primefaces 单元格编辑离开编辑模式
- url-rewriting - 如何根据 URL 中的参数定义不同的 docroot
- javascript - 如何删除数组中的重复属性值