我必须在这里遗漏一些简单的东西。我有一个带有多个视图控制器的应用程序,当用户在另一个视图控制器中导航时,我试图重置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内容。我希望它清楚。
提前致谢
答案 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()
多数民众赞成,希望它能帮助你