我有一个UITableViewCell的子类,它显示在TableView中。每个单元格都有一个文本字段。当调用textFieldDidEndEditing函数时,我希望将输入的文本保存为托管对象上下文中NSManagedObject的属性。
这个函数在我的tableViewCell类中实现:
func textFieldDidEndEditing(textField: UITextField) {
let viewController = ViewController()
let indexPath: NSIndexPath!
viewController.updateCommitsInMOC(self, atIndexPath: indexPath!)
}
这就是它调用的函数。这个函数在我的ViewController类中实现,该类控制由tableViewCells:组成的TableView
func updateCommitsInMOC(cell: CommitTableViewCell, atIndexPath indexPath: NSIndexPath) {
// Fetch Commit
let commit = fetchedResultsController.objectAtIndexPath(indexPath) as! Commit
// Update Cell
commit.contents = cell.commitContents.text!
if cell.repeatStatus.selectedSegmentIndex == 1 { commit.repeatStatus = true }
saveManagedObjectContext()
}
当然,每当用户编辑完文本字段时,我都愿意接受任何关于实现保存行为的其他方法的建议。
您的问题是"如何获取IndexPath"吗?与其UITableviewCell试图弄清楚它在textFieldDidEndEditing中的indexPath是什么,为什么不在updateCommitsInMOC函数中弄清楚呢?
假设你有一个表视图的参考,你就可以做这个
func updateCommitsInMOC(cell: CommitTableViewCell) {
guard let indexPath = tableView.indexPathForCell(cell) else {
return
}
// Fetch Commit
let commit = fetchedResultsController.objectAtIndexPath(indexPath) as! Commit
// Update Cell
commit.contents = cell.commitContents.text!
if cell.repeatStatus.selectedSegmentIndex == 1 { commit.repeatStatus = true }
saveManagedObjectContext()
}
您可以在单元格textField中添加一个标记作为行。像这样:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("idCell")
cell.textField.tag = indexPath.row
return cell
}
和文本Field delegate:
func textFieldDidEndEditing(textField: UITextField) {
let viewController = ViewController()
let indexPath = NSIndexPath(forRow: textField.tag, section: 0)
viewController.updateCommitsInMOC(self, atIndexPath: indexPath!)
}
或者你可以使用超视图:
func textFieldDidEndEditing(textField: UITextField) {
let view = textField.superview!
let cell = view.superview as! UITableViewCell
let viewController = ViewController()
let indexPath = itemTable.indexPathForCell(cell)
viewController.updateCommitsInMOC(self, atIndexPath: indexPath!)
}
我建议您在表视图中使用CCD_ 1方法。然后在它内部,您可以管理从fetchResultController.indexPathForObject(inputObject)
或使用fetchedResultsController.objectAtIndexPath(indexPath)
检索它的单个对象。最后,您可以使用self.managedObjectContext.saveToPersistentStore()
或self.managedObjectContext.save()
。