我正在第二个viewController上编辑电子邮件。如果我在第二个视图(tableViewBudget)中修改电子邮件地址,Label.text(在ViewController中)确实会更改,但表视图Cell不会更改。它始终显示savedEmail.text的第一个值。我如何修改我的代码,以便当我更改另一个表View中的字符串时tableView单元格将会改变?谢谢!
import UIKit
class ViewController:UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet weak var savedEmail: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func exitToHere ( sender: UIStoryboardSegue){
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = savedEmail.text
return cell
}
}
第二视图控制器
import UIKit
class TableviewBudget: UIViewController {
@IBOutlet weak var emailField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func updateEmail(_ sender: Any) {
(presentingViewController as! ViewController).savedEmail.text =
self.emailField.text
}
@IBAction func hideKeyboard(_ sender: Any) {
self.emailField.resignFirstResponder()
}
override func viewWillAppear(_ animated: Bool) {
self.emailField.text = (presentingViewController as! ViewController).savedEmail.text
super.viewWillAppear(animated)
}
}
答案 0 :(得分:1)
用户完成编辑文本后,您可以使用委托向您的案例类UIViewController
中的第一个ViewController
发送回调。
在您的班级TableViewBudget
中将其更改为如此,这将创建一个委托以将数据传递给以前的视图控制器
适用于Swift 3
protocol delegateVC{
func updateEmail(email : String)
}
class TableviewBudget: UIViewController{
//add this inside this class
var delegate : delegateVC?
...
}
现在将您的功能更改为
@IBAction func updateEmail(_ sender: Any) {
self.delegate?.updateEmail(email: self.emailField.text)
}
现在在您的班级ViewController
添加 -
class ViewController:UIViewController,UITableViewDataSource,UITableViewDelegate, delegateVC{
func updateEmail(email : String){
//update label here inside your first VC by getting the cell, using the indexPath of the cell that contains the E-mail
//also update your modal here to contain the next email otherwise if cellForRow gets called again, the e-mail field will get reset
cell.textLabel?.text = email
}
}
还要记住,当您从prepareForSegue
推送TableViewBudget
时,在ViewController
设置此委托,类似
let tableViewBudget = TableViewBudget()
tableViewBudget.delegate = self
答案 1 :(得分:0)
:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reload()
}
答案 2 :(得分:0)
尝试致电
tableView.reloadData()
或
tableView.beginUpdates()
tableView.reloadRows(at: [yourIndexPath], with: .fade)
tableView.endUpdates()
如果你需要很多行但是你只想重新加载一个或几个
,那么第二个版本会更好