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被键盘隐藏时滚动查看