2016-10-27 7 views
0

私はswift 3.0で書かれたプロジェクトで作業しています。私の要件は、いくつかのテキストフィールドに入力したデータをCoreDataに保存し、それらの属性の1つをテーブルビューに取り込むことです。行が選択されると、そのレコードを更新します(テキストフィールドの値を再割り当てします)保存してください)。戻るボタンを押したときにUITableViewのデータが重複する

基本的に私は "Task"という名前のエンティティを持っていて、3つの属性を持っていて、コアデータに保存したこれらの属性(名前)をテーブルビューに読み込みたいとします。したがって、私が入力したデータを編集したいときは、行をタップすると、最初にそれらのデータを入力した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") 
    } 
} 
0

ビューが示されるたびに実行されviewDidAppear方法であなたのtableViewを移入(どちらか最初時間又はanbother詳細ビューコントローラから戻ってくるため)。

次のいずれか

  • はあなたが示すべき新鮮なデータが必要な場合は、それを再増殖する前店(からすべてのオブジェクトを削除する)のviewDidLoad

  • またはクリーンに移入コードを移動することで、一度それを移入。すでにロード要素があなたの配列の内部に存在しているので、そうfor resultGot in results

stores = [] 
+0

卿私はviewWillAppearからすべてのコードをクリアし、私は私のtableViewをリロードすることになっていますのviewDidLoadにそれらをロードする場合は?新しいエントリを追加したり編集したりすると、新しいエントリや更新されたテーブルがテーブルに表示されなくなるからです。 – danutha

+0

次に、2番目の点に記載されているように、 – jalone

関連する問題