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

Ios 如何从另一个viewcontroller重置tableview单元格内容,ios,swift,tableview,Ios,Swift,Tableview,我一定错过了一些简单的东西。我有一个带有多个视图控制器的应用程序,当用户导航回另一个视图控制器时,我正在尝试重置tableview行(特别是单元格.detailTextLabel?.text) SummaryViewController import UIKit class SummaryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { override func viewDidLo

我一定错过了一些简单的东西。我有一个带有多个视图控制器的应用程序,当用户导航回另一个视图控制器时,我正在尝试重置tableview行(特别是
单元格.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()
}

}
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()
}

}
allRecipeData中的元素在全局变量中使用
struct recipeSettings{}

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

firstviewController

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()
}

}
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内容。我希望它是清楚的


提前感谢

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

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

我建议你在离开A->B之前把事情弄清楚

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

假设您有一个名为
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()
}

如果要从另一个控制器在一个控制器中重新加载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()

仅此而已,希望它能帮助您解决问题

假设您只想在移动到下一个视图控制器之前清除所有内容?移动后是否要清除以前的视图控制器内容?@Gihan,感谢您的回复,SummaryViewcontroller和firstviewController由导航控制器连接。从SummaryViewController,用户可以单击后退并导航到firstviewController,从那里,用户还可以单击后退并导航到另一个视图控制器。当用户在firstViewController中单击后退时,如果您在summaryviewController中单击后退到firstViewController(假设您已从firstViewController中推送summaryviewController),我试图做的是清除summaryviewController中的tableview。对summaryviewController的引用丢失。因此,下次当您再次从firstViewController单击时,它将是一个新的summaryviewController。所以你不必担心。请解释“推送summaryviewController”。此时发生的情况是,当我从summaryviewcontroller单击后退,然后在firstviewcontroller中单击后退,然后向前导航到firstviewcontroller,然后再次向前导航到summaryviewcontroller时,
单元格.detailTextLable?的值保持不变。text
将更新答案。似乎您通过seague推送同一个summaryviewController。@Mario感谢您的回复,当我将该函数添加到summaryviewController时,我收到错误“对成员“tableView”的引用不明确”?@Darth您是否持有对tableView的引用?@Mario不,我没有,我需要吗?@Gihan道歉在我的示例中犯了一个错误。firstViewController类中的
dataArray
与SummaryViewController类中的
cell.detailTextLabel?.text
值之间没有任何联系。因此,当我实现解决方案时,它仍然保持不变,必须在
视图将消失
函数我想重置SummaryViewControllert的tableview这里应该为每个类中的数据设置一个数组。或者,如何向tableview提供数据。假设您想要一个完整的硬编码表视图,并且cell.detailTextLabel?的值相同。text只是没有编码。通过变量设置它,然后更改变量中的值,RloadViewWillEnglish位于SummaryViewController而不是firstViewController中。事实上,我写的所有代码都是针对SummaryViewController的。您不必在firstViewController中执行任何操作。我将更改
allRecipeData
的值,因为它是填充tableview的数组,但我仍然需要从firstViewController类执行此操作,因为如果用户从summaryViewController类单击“后退”,我需要tableview保持不变,但如果用户从firstViewController此时我需要重置值