2016-05-09 14 views
0

私はTableViewに表示されるUITableViewCellのサブクラスを持っています。各セルにはテキストフィールドがあります。 textFieldDidEndEditing関数が呼び出されると、入力したテキストを管理対象オブジェクトコンテキストのNSManagedObjectの属性として保存します。UITableViewCellサブクラスのindexPathを取得

この関数は、私のtableViewCellクラスに実装されています。

func textFieldDidEndEditing(textField: UITextField) { 

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

そして、これは、それが呼び出す関数です。この関数は、私のViewControllerクラスでtableViewCellsで構成されてテーブルビューを制御1を実装されます。

私はすべての時間を節約する動作を実装する他の方法には、もちろん、任意の提案に開いている
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() 
} 

ユーザはテキストフィールドの編集を終了する。

+0

あなたが実際に問題を抱えているのですか?このような なぜあなたはセルの代わりに(または同様に)パラメータとしてテキストを渡さないのですか?同じことがステータスのものになります – Wain

+0

@Wain私はそれを行う方法を知らないでしょう。しかし、私は基本的な問題はまだ残っていると思う:私は自分のテーブルビュー内のすべてのセルを通過し、セル内に含まれているテキストフィールドの内容を管理オブジェクトコンテキストに保存する必要があります。内容を変数として取り、それを実装して各テーブルビューのセルによって適切に呼び出されるようにする関数があると考えることができる場合は、答えを残してください! – Jonas

+0

あなたは既にテキストフィールドが編集されたときにそれをするコードを持っていますが、あなたの実際の問題がまだ分かりません。あなたはあなたが持っている解決策に満足していないか、実際の問題があり、あなたが持っているものがうまくいかないことを意味していますか? – Wain

答えて

1

"IndexPathを取得するにはどうすればよいですか"という質問はありますか? UITableViewCellの代わりに、indexPathがtextFieldDidEndEditing内にあるかどうかを調べるために、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() 
} 
+0

ありがとう、これは甘くて短い解決策です! – Jonas

0

テーブルビューで setEditing(editing, animated: animated)メソッドを使用することをお勧めします。 その中で、fetchResultController.indexPathForObject(inputObject)から、またはfetchedResultsController.objectAtIndexPath(indexPath)を使用して、単一のオブジェクトを検索して管理することができます。 最後にself.managedObjectContext.saveToPersistentStore()またはself.managedObjectContext.save()を使用できます。

1

あなたは、セルテキストフィールドに行としてのタグを追加することができますを行うことができ、あなたのtableViewへの参照を持っていると仮定すると

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

少なくともこれはタグを提案してはいけません。少なくとも、ソリューションを実装するにはあまり速くなければ、良いことを示唆することはありません。 – Wain

+0

2番目の解決策がより良い選択肢です。それは私が上記で提案したものです。 – toddg

関連する問題