【问题标题】:Data in the UITableView get duplicated when back button is pressed按下后退按钮时 UITableView 中的数据会重复
【发布时间】: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!]


    }
 }

【问题讨论】:

    标签: ios objective-c uitableview core-data swift3


    【解决方案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 变量,如第二点所述
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      相关资源
      最近更新 更多