2017-09-23 101 views
0

这是我的场景...单击右上角(导航栏)上的加号按钮,会出现带有文本框的alertview,并添加一些数据在文本框中,然后按OK按钮。这会导致文本字段中的数据显示在tableview中,并且它也存储在核心数据中。更新桌面视图(编辑后)中的条目并显示在桌面视图中的问题

然后当我点击那个现在有来自alertview文本框的数据的行时,我转到另一个视图进行编辑。此viewcontroller有一个文本字段,其值来自上一个屏幕的行。现在我点击文本框并编辑它的值,然后按右上角的保存。现在,理想情况下,当我按下保存并转到上一个屏幕时,现在应该在tableview中看到编辑的值,而不是旧的值。

但是,当我按下保存并返回到上一个屏幕时,我所做的暂时看到tableviewcontroller中的更新值。但实际上,该值在核心数据中增加了两次,当我从这个tableview返回到另一个视图并返回时,我不仅看到编辑前存在的值,而且还看到新编辑的值是加了两次!我无法理解这种行为....

在点击编辑画面此保存按钮是我在做什么...

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

在回来的表视图屏幕上,这是我在做什么......(在tableviewcontroller屏幕)

@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() 

} 

在的cellForRowAtIndexPath,这是我在做什么...

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

确定.. @雅典娜取代它的名字......所以我在哪里,包括这些行..? –

+0

在这一行let result =尝试managedContext.fetch(fetchRequest),我得到的结果为零。任何想法..? –

+0

是您的managedContext对象是否正确启动?如果是这样,结果为零的提取请求可能意味着没有找到记录。 – Athena