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