2016-04-27 10 views
0

ユーザが入力する2つのtextViewを持つカスタムtableViewCellがあります。私が試したテーブルビューの行を検出したいのですが:ユーザがカスタムテーブルビューのセルにあるセルを検出する

let currentIndexPath = tableView.indexPathForSelectedRow! 

let currentCell = tableView.cellForRowAtIndexPath(currentIndexPath) as! Test2TableViewCell 

とXcodeのエラーfatal error: unexpectedly found nil while unwrapping an Optional valueは、私には、選択した行が見つからないことを意味します。私は、ユーザーがtextViewをtableViewCellの上に入力すると、実際のセルをタップしているとは見なさないと仮定しています。 ユーザーがどの行にいるかを検出する方法はありますか?

+0

このコードは、セルクラスまたはtableviewクラスにありますか? – Paulw11

+0

このコードは私のtableViewクラスにあります@ Paulw11 –

+0

私はあなたが関連するデータモデルオブジェクトへの参照を保持し、UITextViewDelegateメソッドをtableviewcellクラスに移動するプロパティをtableviewcellクラスに追加することをお勧めします。次に、セルがView Controllerにテキストが変更されたことなどを通知するためのプロトコルを実装します。 View Controllerはセルから直接データモデルプロパティにアクセスでき、行番号を知る必要はありません。テーブルの並び替え(行の削除、挿入、移動)ができる場合は、行番号の保存は面倒です – Paulw11

答えて

1

すべてのUIViewサブクラスに存在するタグプロパティの使用を検討してください。

internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("CustomCell"){ 
     cell.textView.tag = indexPath.row 

    } 
} 

internal func textViewDidBeginEditing(textView: UITextView){ 
    let row = textView.tag 
} 
+0

Alexさん、ありがとう!私はそれについてもっと考えているので、私の最終目標は何か他のものが必要なので、投稿した質問を使うことはできません。時間がある場合は、私がここに投稿した新しい質問を見てください:http://stackoverflow.com/questions/36903652/getting-data-from-all-tableviewcells。私は助けに感謝します! –

1

セルにUITextFieldを入力すると、セルが選択されていないということが正しいです。

これを簡単に行うには、行をUITextViewのタグとして保存してから、textViewDidFinish ... delegateメソッドでセクションとタグを行としてインデックスパスを作成します。

また、一意のtextViewごとに変数を作成し、textViewDidFinishデリゲートメソッドで使用しているtextViewとその2つを比較して比較することもできます。

+0

助けてくれてありがとう、アレックス!私はそれについてもっと考えているので、私の最終目標は何か他のものが必要なので、投稿した質問を使うことはできません。時間がある場合は、私がここに投稿した新しい質問を見てください:http://stackoverflow.com/questions/36903652/getting-data-from-all-tableviewcells。私は助けに感謝します! –

2

あなたは正しいあなたのcellForRow方法は、ブロックを使用してそれを確認することができます:

internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("CustomCell"){ 
     cell.editingDidBeginHandler = { [self weak], text 
      //do your stuff, save index path, or tag or something else. 
     } 

    } 
} 

をあなたのUITableViewCellのサブクラス内部:

var editingDidBeginHandler:(()->())? 

internal func textViewDidBeginEditing(textView: UITextView){ 
    if let handler = editingDidBeginHandler { editingDidBeginHandler() } 
} 
+0

助けてくれてありがとう、アレックス!私はそれについてもっと考えているので、私の最終目標は何か他のものが必要なので、投稿した質問を使うことはできません。時間がある場合は、私がここに投稿した新しい質問を見てください:http://stackoverflow.com/questions/36903652/getting-data-from-all-tableviewcells。私は助けに感謝します! –

0

あなたは、そのインデックスパスを決定するために、テーブルビューポイントへのTextViewポイントを変換することができます。

func textViewDidBeginEditing(textView: UITextView) { 
    let pointInTable = textView.convertPoint(textView.bounds.origin, toView: yourTableView) 
    let textViewIndexPath = yourTableView.indexPathForRowAtPoint(pointInTable) 
    // do something else 
} 

これはテーブルビューにテキストビューのデリゲートを設定することを想定しています。

カスタムセルにテキストビューデリゲートを設定する場合は、カスタムセル内でtextViewDidBeginEditing関数を捕捉し、プロトコルを使用してイベントをテーブルビューに渡す必要があります。

+0

助けてくれてありがとう、アレックス!私はそれについてもっと考えているので、私の最終目標は何か他のものが必要なので、投稿した質問を使うことはできません。時間がある場合は、私がここに投稿した新しい質問を見てください:http://stackoverflow.com/questions/36903652/getting-data-from-all-tableviewcells。私は助けに感謝します! –

関連する問題