ios重新加载TableView

时间:2016-11-19 02:44:02

标签: ios swift uitableview

我正在第二个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)
    }

}

3 个答案:

答案 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)

ViewController中的

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reload()
}

答案 2 :(得分:0)

尝试致电

 tableView.reloadData() 

 tableView.beginUpdates()
 tableView.reloadRows(at: [yourIndexPath], with: .fade)
 tableView.endUpdates()

如果你需要很多行但是你只想重新加载一个或几个

,那么第二个版本会更好