2017-09-23 16 views
0

これは私のシナリオです...ナビゲーションバーの右上にあるプラスボタンをクリックすると、テキストフィールドの警告ビューが表示され、データを追加しますテキストフィールドに「OK」ボタンを押します。これにより、テキストフィールドのデータがテーブルビューに表示され、コアデータにも格納されます。Tableviewのエントリを更新してTableviewに表示する問題

次に、alertviewテキストフィールドのデータを持つ行をクリックすると、編集用の別のビューに移動します。このviewcontrollerには、前の画面の行の値を持つテキストフィールドがあります。今度は、テキストフィールドをクリックして値を編集し、右上の「保存」を押します。ここで、saveを押して前の画面に移動すると、編集した値が古い値の代わりにtableviewに表示されるようになりました。

しかし、私は保存を押して前の画面に戻るときは、更新された値をtableviewcontrollerに表示しています。しかし実際には、その値がコアデータに2回追加され、このtableviewから別のビューに戻って戻ってくると、編集前の値だけでなく新しい編集値も表示されます二度追加!私は、この動作を理解することができないんだけど....

保存]ボタンをクリックすると編集画面では、これは私がやっているものです...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "save" { 
      editedModel = editTextField.text 
    } 
} 

テーブルビューに戻ってくるには画面には、これは私がcellForRowAtIndexPathで

@IBAction func saveToMainEditViewController (segue:UIStoryboardSegue) { 
    let detailViewController = segue.source as! EditCategoriesTableViewController 
    let index = detailViewController.index 
    let modelString = detailViewController.editedModel //Edited model has the edited string 

    let myCategory1 = Category(context: self.context) 
    myCategory1.categoryName = modelString 
    mangObjArr[index!] = myCategory1  

    //Saving to CoreData 
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { 
     return 
    } 
    let managedContext = appDelegate.persistentContainer.viewContext 
    let entity = NSEntityDescription.entity(forEntityName: "Category", in: managedContext) 
    let category = NSManagedObject(entity: entity!, insertInto: managedContext) 

    category.setValue(myCategory1.categoryName, forKeyPath: "categoryName") 
    category.setValue(myCategory1.categoryId, forKey: "categoryId") 
    do { 

     try managedContext.save() 
    } catch let error as NSError { 
     print("Could not save. \(error), \(error.userInfo)") 
    } 
    categoryTableView.reloadData() 

} 

tableviewcontroller画面で)...やっている、これは私が...やっているものです

let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath) 

    let person = mangObjArr[indexPath.row] 
    cell.textLabel?.text = person.categoryName 
    return cell 

答えて

0

更新前のレコードの代わりに新しいレコードを挿入しています
カテゴリエンティティに挿入する前に、現在の名前でレコードをフェッチするコードを作成し、現在の名前を編集した文字列に置き換えて保存します。
このコードは古い名前のレコードをフェッチして、新しい

let fetchRequest : NSFetchRequest<Category> = Category.fetchRequest() 
fetchRequest.predicate = NSPredicate(format: "(categoryName == %@)", argumentArray: [*Your current categoryName*]) 
do { 
    let result = try managedContext.fetch(fetchRequest) 
    if let toBeUpdatedRecord = result.first 
    { 
     toBeUpdatedRecord.categoryName = newName 
     //here you should save 
    } 
} catch{} 
+0

[OK]を.. @アテナにその名を置き換え...だからここで私はこれらの行を含めるようにしていますか..? –

+0

この行では、result = try managedContext.fetch(fetchRequest)とし、結果をnilとして取得しています。何か案が..? –

+0

は正しく開始されたmanagedContextオブジェクトですか?もしそうなら、フェッチ要求の結果nilはレコードが見つからなかったことを意味します。 – Athena

関連する問題