按下后退按钮时 UITableView 中的数据会重复
Posted
技术标签:
【中文标题】按下后退按钮时 UITableView 中的数据会重复【英文标题】:Data in the UITableView get duplicated when back button is pressed 【发布时间】:2016-10-27 10:50:54 【问题描述】:我正在从事一个用 swift 3.0 编写的项目。我的要求是保存我在某些文本字段中输入的数据(在 CoreData 上)并将其中一个属性填充到表格视图中,因此一旦选择了一行,我想更新该记录(在我的文本字段上重新分配值并保存)。
基本上我有一个名为“Task”的实体,它有三个属性,我想将我保存在核心数据上的一个属性(称为“名称”)填充到表格视图中。因此,当我想编辑我输入的数据时,我点击一行,它会将我引导到最初输入这些数据的 ViewController。但是,当我单击后退按钮而不保存数据时,它将复制数组并填充到我的表格视图中。我怎么能阻止这个。表格视图类的代码如下。
import UIKit
import CoreData
class TableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
@IBOutlet weak var tableView: UITableView!
var stores = [Store] ()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
override func viewDidLoad()
super.viewDidLoad()
self.tableView.reloadData()
// Do any additional setup after loading the view.
override func viewDidAppear(_ animated: Bool)
let request = NSFetchRequest <NSFetchRequestResult> (entityName: "Store")
request.returnsObjectsAsFaults = false
do
let results = try context.fetch(request) as! [Store]
// check data existance
if results.count>0
print(results.count)
for resultGot in results
if let expName = resultGot.name
print("expence name is :", expName)
stores += [resultGot]
print("my array is : \(stores)")
self.tableView.reloadData()
catch
print("No Data to load")
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return stores.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = UITableViewCell ()
let store = stores [indexPath.row]
cell.textLabel?.text = store.name
//cell.textLabel?.text = myExpensesArray[indexPath.row]
return cell
@IBAction func nextButtonPressed(_ sender: AnyObject)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
performSegue(withIdentifier: "editStore", sender: nil)
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "editStore"
let v = segue.destination as! ViewController
let indexPath = self.tableView.indexPathForSelectedRow
let row = indexPath?.row
v.store = stores[row!]
【问题讨论】:
【参考方案1】:发生这种情况是因为您的数组中存在已加载的元素。当你回到之前加载的ViewController
时,它的方法viewWillAppear
,viewDidAppear
根据viewController's
生命周期每次调用。
您需要在返回时使用removeAll()
方法清除之前加载的数组。
使用下面的代码:
override func viewDidAppear(_ animated: Bool)
stores.removeAll() // clears all element
let request = NSFetchRequest <NSFetchRequestResult> (entityName: "Store")
request.returnsObjectsAsFaults = false
do
let results = try context.fetch(request) as! [Store]
// check data existance
if results.count>0
print(results.count)
for resultGot in results
if let expName = resultGot.name
print("expence name is :", expName)
stores += [resultGot]
print("my array is : \(stores)")
self.tableView.reloadData()
catch
print("No Data to load")
【讨论】:
【参考方案2】:您在 viewDidAppear
方法中填充您的 tableView,该方法在每次显示视图时执行(第一次或从另一个详细视图控制器返回)。
你也可以
通过将填充代码移动到 viewDidLoad 来填充一次
如果您需要显示新数据,则在重新填充之前清理(删除所有对象)存储。所以在for resultGot in results
插入类似的东西
stores = []
【讨论】:
先生,如果我清除 viewWillAppear 中的所有代码并将它们加载到 viewDidLoad 我应该在哪里重新加载我的 tableView?因为当我添加新条目或编辑它时,它不会在我的 tableView 中显示新条目或更新的条目 然后在用新数据重新填充之前重置 stores 变量,如第二点所述以上是关于按下后退按钮时 UITableView 中的数据会重复的主要内容,如果未能解决你的问题,请参考以下文章