按下后退按钮时 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时,它的方法viewWillAppearviewDidAppear根据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 中的数据会重复的主要内容,如果未能解决你的问题,请参考以下文章

按下chrome后退按钮时,模式内的数据复制

在Android上按下后退按钮时Runnable线程会发生啥?

按下后退按钮时保存

按下后退按钮时如何删除堆栈中的所有活动

如果在 WebView 中按下后退按钮,如何返回上一页?

按下 UINavigationController 的后退栏按钮时执行操作