如何从另一个viewcontroller重置tableview单元格内容

时间:2018-06-07 20:41:49

标签: ios swift tableview

我必须在这里遗漏一些简单的东西。我有一个带有多个视图控制器的应用程序,当用户在另一个视图控制器中导航时,我试图重置tableview行(特别是cell.detailTextLabel?.text

SummaryViewController

import UIKit

class SummaryViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if isMovingFromParentViewController{
        allRecipeData.removeAll()
    }
}

let summaryStatementArr = ["Cell One", "Cell Two", "Cell Three", "Cell Four"]


var allRecipeData = [recipeSettings.recipeTimeSet, recipeSettings.selectedStirTimeArr.joined(separator: ", "), recipeSettings.recipeTimeSet, recipeSettings.recipeTimeSet]


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 4
}

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

    cell.textLabel?.text = summaryStatementArr[indexPath.row] 
    cell.detailTextLabel?.text = allRecipeData[indexPath.row] // I want to reset this from firstviewController 
    return(cell)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

allRecipeData中的元素使用struct recipeSettings{}

在全局变量中声明

我有另一个视图控制器链接到上面一个名为firstviewController的视图控制器

firstviewController

import UIKit

class firstViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Code here to reset tableview cells in SummaryViewController
}


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: 
IndexPath) {
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) 
-> Int {
    return 7
}

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

cell.textLabel?.text = "Data"
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

如何从firstviewController重置/重新加载/清除SummaryViewController的tableview内容。我希望它清楚。

提前致谢

3 个答案:

答案 0 :(得分:0)

您可以在视图出现时重新加载tableView内容。

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

答案 1 :(得分:0)

我建议你在离开A - >之前清理一下。乙

在您的示例中,您已经对数据进行了硬编码,因为在适当的情况下,您必须将数据保存在数组中。此数组应该能够从您的代理外部进行设置。

假设您有一个名为dataArray的数组,其中包含7个元素。

import UIKit

class SummaryViewController: UIViewController, UITableViewDelegate, 
UITableViewDataSource {

var dataArray = ["data1","data2","data3","data4","data5","data6","data7"]
override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // Code here to reset tableview cells in SummaryViewController
}


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: 
IndexPath) {}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) 
-> Int {
    return dataArray.count
}

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

    cell.textLabel?.text = dataArray[indexPath.row]
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}

现在,当您移动到下一个视图控制器时,您需要的是

dataArray = []
tableView.reloadData()

如果您想从下一个课程中执行此操作,您可以保留SummaryViewController的引用并执行相同的操作。不要忘记保存视图控制器的内存。

所以在你的夏季班工具

func viewWillDisappear(_ animated: Bool) {
    dataArray = []
    tableView.reloadData()
}

答案 2 :(得分:0)

如果要从另一个控制器在一个Controller中重新加载tableView,则应使用委托和协议机制。

创建协议

  protocol TableReloader {
     func reloadTable() 
  }

然后确认包含tableView的第一个控制器:

  class ViewController1: TableReloader {
      func reloadTable() {
        self.tableView.reloadData() //instead of tableView use your table outlet's name
      }
  }

在要重新加载此表的secondViewController中,请使用委托:

  class ViewController2 {
      weak var delegate: TableReloader?
  }

从ViewController1移动到ViewController2时,您需要为ViewController1中的委托赋予值:

  let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2

  vc2.delegate = self // this is what I was saying to do.
  // now push or present

现在在ViewController2中,每当你想重新加载ViewController1的tableView时,只需使用:

  delegate?.reloadTable()

多数民众赞成,希望它能帮助你