2016-05-09 24 views
0

Ich habe eine Unterklasse von UITableViewCell, die in einer TableView angezeigt wird. Jede Zelle hat ein Textfeld. Wenn die Funktion 'textFieldDidEndEditing' aufgerufen wird, möchte ich den eingegebenen Text als Attribut eines NSManagedObject in meinem verwalteten Objektkontext speichern.Get indexPath in UITableViewCell Unterklasse

Diese Funktion wird in meiner tableViewCell Klasse implementiert:

func textFieldDidEndEditing(textField: UITextField) { 

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

Und dies ist die Funktion es nennt. Diese Funktion wird in meiner Viewcontroller Klasse implementiert, die eine, die die Tableview steuert, die aus dem tableViewCells gemacht wird:

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

Ich bin natürlich offen für alle Vorschläge, andere Möglichkeiten, um das Sparverhalten jedes Mal zu implementieren Der Benutzer ist fertig mit der Bearbeitung des Textfelds.

+0

Sie haben tatsächlich ein Problem? Warum übergibst du den Text nicht als Parameter anstelle der Zelle (oder so gut)? Das gleiche gilt für die Status-Sache – Wain

+0

@Wain würde ich nicht wissen, wie das geht. Aber ich glaube, das Grundproblem bleibt bestehen: Ich muss jede Zelle in meiner Tabellenansicht durchgehen und den Inhalt eines in der Zelle enthaltenen Textfelds in den Kontext des verwalteten Objekts speichern. Wenn Sie sich eine Funktion vorstellen können, die nur den Inhalt als Variable akzeptiert und weiß, wie sie implementiert werden muss, damit sie von jeder Tabellenansichtszelle entsprechend aufgerufen wird, hinterlassen Sie bitte eine Antwort! – Jonas

+0

Sie haben bereits Code, der das tut, wenn ein Textfeld bearbeitet wird, ich bin immer noch nicht sicher, was Ihr tatsächliches Problem ist. Sie sind einfach nicht glücklich mit der Lösung, die Sie haben, oder es gibt ein tatsächliches Problem, das bedeutet, dass das, was Sie haben, nicht funktioniert? – Wain

Antwort

1

Ist Ihre Frage "Wie bekomme ich den IndexPath"? Anstatt das UITableviewCell herauszufinden, was indexPath in textFieldDidEndEditing ist, warum erfährst du es nicht einfach in der Funktion updateCommitsInMOC?

Sie Angenommen, haben einen Verweis auf Ihre Tableview können Sie nur diese

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

Danke, das ist eine süße und kurze Lösung! – Jonas

0

Ich empfehle Ihnen, in Ihrer Tabellenansicht die setEditing(editing, animated: animated) Methode zu verwenden. Dann können Sie darin das einzelne Objekt verwalten, das es aus der fetchResultController.indexPathForObject(inputObject) oder wie Sie fetchedResultsController.objectAtIndexPath(indexPath) abgerufen haben. Schließlich können Sie self.managedObjectContext.saveToPersistentStore() oder self.managedObjectContext.save() verwenden.

1

Sie tun einen Tag als Zeile in Zelle Textfield hinzufügen können. wie folgt aus:

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

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

    return cell 
} 

und das Textfeld ein Delegierter:

func textFieldDidEndEditing(textField: UITextField) { 

    let viewController = ViewController() 
    let indexPath = NSIndexPath(forRow: textField.tag, section: 0) 
    viewController.updateCommitsInMOC(self, atIndexPath: indexPath!) 
} 

oder Sie die Superview verwenden können:

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

Bitte schlagen Sie keine Tags dafür vor, zumindest nicht ohne eine gute, wenn nicht so schnell zu implementieren Lösung zu empfehlen – Wain

+0

Ihre zweite Lösung scheint die bessere Option zu sein. Das habe ich oben vorgeschlagen. – toddg