调用 reloadData() 刷新 TableView - 可重用代码
Call reloadData() to refresh TableView - Reusable Code
我需要 tableView 在通过 textView 添加一行后执行 reloadData()。我的 tableViews 都使用工作正常的可重用代码。
下面是我的可重用 TableViewCode。
class ReusableSubtitleTable: NSObject, UITableViewDataSource, UITableViewDelegate{
let cell = "cell"
var dataArray = [String]()
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) {
print("DataArray count from table view = \(dataArray.count)")
return dataArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let selfSizingCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SelfSizingCell
let num = indexPath.row
selfSizingCell.titleText.text = (stepText[num])
selfSizingCell.subtitleText.text = dataArray[num]
return selfSizingCell
}
}
下面的函数使用可重复使用的代码来显示 table,效果很好。
class DetailViewController: UIViewController {
let step = 13
var tableView: UITableView!
let dataSource = ReusableSubtitleTable()
var selectedEntry: JournalEntry!
var dataModel = [String]()
var didSave = false
var coreDataManager = CoreDataManager()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = dataSource
tableView.dataSource = dataSource
dataSource.dataArray = dataModel
@IBAction func unwindToDetail( _ sender: UIStoryboardSegue) {
dataModel[10] = step11
didSave = coreDataManager.updateEntry(step11: step11, selectedEntry: selectedEntry)
}
}
当用户想要添加到最后一行时,问题就出现了。用户点击一个按钮,然后被带到下一个控制器,它是一个 TextView。当用户完成他们的输入时,他们点击 'Save' 按钮,该按钮通过展开 returned 到 DetailViewController。 selectedEntry 被保存并且 dataModel 被更新。现在 table 视图需要重新加载才能显示添加的文本。
我试过在 didSave 之后添加 tableView.ReloadData()。我已经尝试过 Dispatch 并尝试在 return 通过展开从 textView 中保存数据,但这也不起作用。
我尝试将以下函数添加到 ReusableTableView 并在核心数据更新后调用它 - 没有错误,但它不会重新加载 table。
func doReload(){
tableView.reloadData()
}
我已验证数据已保存,如果我 return 到摘要控制器然后继续 DetailViewController,它会显示。
感谢任何帮助。
将 UITableView
reloadData()
放在 viewWillAppear
或 viewDidAppear
中应该可以解决这个问题。
例如:
func viewDidAppear(_ animated: bool) {
super.viewDidAppear(animated)
tableView.reloadData()
}
这是因为视图层次结构在 segue 展开期间尚未被视为“可见”,以及为什么您通过返回重新加载视图控制器来看到它起作用。 reloadData()
函数,为了提高效率,只重新显示可见的单元格,并且在展开时单元格不是“可见的”。
Apple Documentation - UITableView.reloadData():
For efficiency, the table view redisplays only those rows that are
visible.
我需要 tableView 在通过 textView 添加一行后执行 reloadData()。我的 tableViews 都使用工作正常的可重用代码。 下面是我的可重用 TableViewCode。
class ReusableSubtitleTable: NSObject, UITableViewDataSource, UITableViewDelegate{
let cell = "cell"
var dataArray = [String]()
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) {
print("DataArray count from table view = \(dataArray.count)")
return dataArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let selfSizingCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SelfSizingCell
let num = indexPath.row
selfSizingCell.titleText.text = (stepText[num])
selfSizingCell.subtitleText.text = dataArray[num]
return selfSizingCell
}
}
下面的函数使用可重复使用的代码来显示 table,效果很好。
class DetailViewController: UIViewController {
let step = 13
var tableView: UITableView!
let dataSource = ReusableSubtitleTable()
var selectedEntry: JournalEntry!
var dataModel = [String]()
var didSave = false
var coreDataManager = CoreDataManager()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = dataSource
tableView.dataSource = dataSource
dataSource.dataArray = dataModel
@IBAction func unwindToDetail( _ sender: UIStoryboardSegue) {
dataModel[10] = step11
didSave = coreDataManager.updateEntry(step11: step11, selectedEntry: selectedEntry)
}
}
当用户想要添加到最后一行时,问题就出现了。用户点击一个按钮,然后被带到下一个控制器,它是一个 TextView。当用户完成他们的输入时,他们点击 'Save' 按钮,该按钮通过展开 returned 到 DetailViewController。 selectedEntry 被保存并且 dataModel 被更新。现在 table 视图需要重新加载才能显示添加的文本。
我试过在 didSave 之后添加 tableView.ReloadData()。我已经尝试过 Dispatch 并尝试在 return 通过展开从 textView 中保存数据,但这也不起作用。
我尝试将以下函数添加到 ReusableTableView 并在核心数据更新后调用它 - 没有错误,但它不会重新加载 table。
func doReload(){
tableView.reloadData()
}
我已验证数据已保存,如果我 return 到摘要控制器然后继续 DetailViewController,它会显示。
感谢任何帮助。
将 UITableView
reloadData()
放在 viewWillAppear
或 viewDidAppear
中应该可以解决这个问题。
例如:
func viewDidAppear(_ animated: bool) {
super.viewDidAppear(animated)
tableView.reloadData()
}
这是因为视图层次结构在 segue 展开期间尚未被视为“可见”,以及为什么您通过返回重新加载视图控制器来看到它起作用。 reloadData()
函数,为了提高效率,只重新显示可见的单元格,并且在展开时单元格不是“可见的”。
Apple Documentation - UITableView.reloadData():
For efficiency, the table view redisplays only those rows that are visible.