Получить indexPath в подклассе UITableViewCell

У меня есть подкласс UITableViewCell, который отображается в TableView. Каждая ячейка имеет текстовое поле. Когда вызывается функция textFieldDidEndEditing, я хочу сохранить введенный текст как атрибут NSManagedObject в моем контексте управляемого объекта.

Эта функция реализована в моем классе tableViewCell:

func textFieldDidEndEditing(textField: UITextField) {

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

И это функция, которую он вызывает. Эта функция реализована в моем классе ViewController, который управляет TableView, состоящим из tableViewCells:

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

Я, конечно, открыт для любых предложений относительно других способов реализации режима сохранения каждый раз, когда пользователь редактирует текстовое поле.


person Jonas    schedule 09.05.2016    source источник
comment
у тебя на самом деле проблема? почему бы вам не передать текст в качестве параметра вместо ячейки (или также)? то же самое касается статуса   -  person Wain    schedule 09.05.2016
comment
@Wain Я бы не знал, как это сделать. Но я думаю, что основная проблема все еще остается: мне нужно просмотреть каждую ячейку в моем табличном представлении и сохранить содержимое текстового поля, содержащегося в ячейке, в контекст управляемого объекта. Если вы можете придумать функцию, которая принимает содержимое только как переменную, и знаете, как ее реализовать, чтобы она правильно вызывалась каждой ячейкой табличного представления, пожалуйста, оставьте ответ!   -  person Jonas    schedule 09.05.2016
comment
у вас уже есть код, который делает это при редактировании текстового поля, я до сих пор не уверен, в чем ваша проблема. вы просто недовольны решением, которое у вас есть, или есть реальная проблема, которая означает, что то, что у вас есть, не работает?   -  person Wain    schedule 09.05.2016
comment
@Wain То, что у меня есть, не работает. Я не могу обновить manageObjectContext при вызове функции textFieldDidEndEditing, потому что я не знаю, как установить связь между отдельными ячейками и управляемыми объектами, между текстовыми полями и атрибутами содержимого.   -  person Jonas    schedule 09.05.2016


Ответы (3)


Ваш вопрос «Как мне получить IndexPath»? Вместо того, чтобы UITableviewCell пытался выяснить, что такое indexPath в textFieldDidEndEditing, почему бы вам просто не выяснить это в функции 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()
}
person toddg    schedule 09.05.2016
comment
Спасибо, это сладкое и короткое решение! - person Jonas; 09.05.2016

Вы можете добавить тег как строку в текстовом поле ячейки. как это:

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!)
}
person abraaoan    schedule 09.05.2016
comment
пожалуйста, не предлагайте теги для этого, по крайней мере, не предлагая хорошее, если не так быстрое решение для реализации - person Wain; 09.05.2016
comment
Ваше второе решение кажется лучшим вариантом. Это то, что я предложил выше. - person toddg; 09.05.2016

Я предлагаю вам использовать в своем табличном представлении метод setEditing(editing, animated: animated). Затем внутри него вы можете управлять одним объектом, извлекая его из fetchResultController.indexPathForObject(inputObject) или, как вы использовали fetchedResultsController.objectAtIndexPath(indexPath). Наконец, вы можете использовать self.managedObjectContext.saveToPersistentStore() или self.managedObjectContext.save().

person ciccioska    schedule 09.05.2016