在UITableViewCell子类中获取indexPath

时间:2016-05-09 13:58:54

标签: swift uitableview core-data uiviewcontroller nsindexpath

我有一个在TableView中显示的UITableViewCell的子类。每个单元格都有一个文本字段。当调用textFieldDidEndEditing func时,我想将输入的文本保存为我的托管对象上下文中的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()
}

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

3 个答案:

答案 0 :(得分:1)

您的问题是“如何获取IndexPath”?而不是UITableviewCell试图找出它在indexFieldDidEndEditing中的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()
}

答案 1 :(得分:1)

您可以在单元格textField中将标记添加为行。 像这样:

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

或者你可以使用superview:

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

答案 2 :(得分:0)

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