Swift:当 didSelectRowAtIndexPath 时如何更新 Core Data 中的数据?

Posted

技术标签:

【中文标题】Swift:当 didSelectRowAtIndexPath 时如何更新 Core Data 中的数据?【英文标题】:Swift: How to update data in Core Data when didSelectRowAtIndexPath? 【发布时间】:2016-09-20 16:43:22 【问题描述】:

我搜索了其他问题并提出了这个问题,因为我找不到适合我的东西。

我在核心数据中有一些数据,想在调用didSelectRowAtIndexPath 时更新它。这是我的代码

class ViewController: UIViewController, UITableViewDelegate 

var todo = [NSManagedObject]()
var JSON = Data.sharedInstance

@IBOutlet var TableView: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.JSON.JSONData  
        SVProgressHUD.dismiss()
        self.TableView.reloadData()
    


override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedobject = appDelegate.managedObjectContext

    let fetchrequest = NSFetchRequest(entityName: "ToDo")
    do 
        let results = try managedobject.executeFetchRequest(fetchrequest)
        todo = results as! [NSManagedObject]

      catch 
        print("error")
    
    TableView.reloadData()


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return todo.count


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

   let state = todo[indexPath.row].valueForKey("state") as? Float
    print(state)


    if state == 0.0 
    cell.textLabel?.text = todo[indexPath.row].valueForKey("name") as? String
    
    return cell


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 


现在,当调用didSelectRowAtIndexPath 时,我想将cellForRowAtIndexPath 中可以看到的键“state”更新为1.0

谁能告诉我如何更新“state”的值。谢谢

【问题讨论】:

你试过let object = todo[indexPath.row] object.setValue(yourValue, forKey: "state")然后用主上下文保存。 在任何其他情况下更新核心数据的方式相同。 @Santosh 我应该在 didSelectRowAtIndexPath 中添加代码吗? @TomHarrington 哪个方向? didSelectRowAtIndexPath 并没有使更新 Core Data 与以其他方法更新它不同。关于如何更新核心数据的真正问题是一般,不只是在这里? 【参考方案1】:

创建一个类似reloadData 的新方法,并从viewDidAppear 移动获取对象的代码。在didSelectRowAtIndexPath 中,执行以下操作:

todo[indexPath.row].updateValue(NSNumber(float: 1.0), forKey: "state") // Sample syntax only. Not sure if it is correct.
managedObjectContext.save()

reloadData()

【讨论】:

我已经设法更新了它。但是更新后它应该转到其他视图控制器,但是它没有显示在两个视图控制器中,如何在当前表视图中删除?【参考方案2】:

我不知道你的模型和Core Data有什么关系,但想法是在didSelectedRowAtIndexPath调用时更新模型,并告诉tableView reloadData()。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
     // Update in todo array.
     // Save it, even I don't recommend to save it here,
     tableView.reloadData()

通常,应用程序进入后台时可以保存数据。或者其他一些不会经常调用的地方,因为保存是一项成本很高的工作。

【讨论】:

谢谢安东尼奥。我已经设法更新它。但是更新后它应该转到其他视图控制器,但是它没有显示在两个视图控制器中,如何在当前表视图中删除? 你如何设法去其他 ViewController,performSegue(withIdentifier:sender:) 通常,我们将数据保存在一个 VC 中,然后从另一个 VC 中加载数据。 @raja 基本上,我有一个选项卡式应用程序。 “状态”属性有 0 或 1。如果它在 0 中,它将在选项卡 0 中,如果它是 1,将在选项卡 1 中。所以,当用户点击单元格时,即当 didSelectRowAtIndexPath 被调用时,我想要“状态” 0 在核心数据中更新为 1,为此我提出了这个问题。现在,我设法得到了它,但正如我告诉你的那样,它现在显示在两个选项卡中,如果我删除 0 选项卡中的行,它也会自动在选项卡 1 中被删除。这是我的问题。

以上是关于Swift:当 didSelectRowAtIndexPath 时如何更新 Core Data 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

表格向上滚动并返回该单元格时的 UITableViewCell 背景图像问题

swift Swift - 当UITextField被键盘隐藏时滚动查看

didSelectRowAtIndexPath 不会在 ViewController 中触发

Swift:当键盘显示时向上滚动视图

Swift 3 - 当布尔为真时如何移动精灵节点?

无法获取 didSelectRowAtIndexPath 来注册点击