在 UITableViewCell 子类中获取 indexPath

Get indexPath in UITableViewCell subclass

我有一个显示在 TableView 中的 UITableViewCell 的子class。每个单元格都有一个文本字段。当调用 textFieldDidEndEditing 函数时,我想将输入的文本作为 NSManagedObject 的属性保存在我的托管对象上下文中。

这个功能是在我的tableViewCell中实现的class:

func textFieldDidEndEditing(textField: UITextField) {

    let viewController = ViewController()
    let indexPath: NSIndexPath!
    viewController.updateCommitsInMOC(self, atIndexPath: indexPath!)
}

这是它调用的函数。这个功能是在我的ViewControllerclass中实现的,控制由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()
}

我当然愿意接受任何有关在用户每次完成编辑文本字段时实现保存行为的其他方法的建议。

我建议你在你的表格视图中使用 setEditing(editing, animated: animated) 方法。 然后在其中,您可以管理从 fetchResultController.indexPathForObject(inputObject) 或您使用的 fetchedResultsController.objectAtIndexPath(indexPath) 检索它的单个对象。 最后你可以使用 self.managedObjectContext.saveToPersistentStore()self.managedObjectContext.save().

你的问题是"How do I get the IndexPath"?与其让 UITableviewCell 在 textFieldDidEndEditing 中找出它的 indexPath 是什么,不如在 updateCommitsInMOC 函数中找出它?

假设您有对 tableView 的引用,您可以这样做

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

您可以在单元格文本字段中添加标签作为行。 像这样:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("idCell")
    cell.textField.tag = indexPath.row

    return cell
}

和 textField 委托:

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!)
}