在UITableViewCell子类中获取indexPath



我有一个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()

最新更新