2017-01-15 9 views
0

私はカスタムUITableViewCellクラスを持っています。カスタム内の行番号を知るUITableViewCell - 新しいシワ

セルに編集可能なUITextFieldがあります。このテキストフィールドが

func textFieldDidEndEditing(_ textField: UITextField) 

内のIトラップに編集の最後に編集されたときに、私のカスタムセルクラスがUITextFieldDelegateを実装ので、私は確かにコールバックを得るのですか。

同様の質問に対する他の回答と同様です。まず、テーブルをロードするときにUITextFieldのタグを行番号に設定しようとしました。

これはうまくいきますが、しわがあります。私のテーブルでは、行を移動できます。行が移動されると、テーブルがロードされたときにタグが保持されるので、タグは挿入時にすべてオフになります。私は移動後にテーブルをリロードすることでこれを解決することができますが、これはリストを先頭に戻します。

1).tagを使用せずにカスタムセルクラス内の行番号を取得するには、よりクリーンな方法がありますか?これは、行の移動を許可すると失敗します。

2)もし#1に該当しない場合は、先に表示された行を最初に取得するために表示をリロードしてから、テーブルのリロードを行った後、同じトップカレント行にリセットして戻る頂点に?

また、私はちょうどので、私は編集しかしこの呼ばれることは決してありませんした後に行番号を持っているでしょうのUITableViewが含まれているのUIViewController内でこの

func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) 

とトラップ編集の終わりを使用しようとしました。これを解決するもう1つの方法は、didEndEditingRowAtを強制的に呼び出すことです。何らかの理由でこれは呼び出されません。 UITextFieldDelegateは私のViewControllerである(それは含まれています。私は編集

var textFieldHandle : UITextField? 
func textFieldDidBeginEditing(_ textField: UITextField) { 
    print("editing field in cell") 
    textFieldHandle = textField 
} 

func textFieldDidEndEditing(_ textField: UITextField) { 
    print("done editing text field in cell with text -\(textField.text!)-") 
    if textFieldHandle != nil { 
     textFieldHandle?.endEditing(true) // force end editing so get table event - does not work 
     if let index = textFieldHandle?.tag { 
      if index >= 0 && index < quizListItems.count { 
       // if we have a proper index then store back in answer array so we dont lose it 
       quizListItems[index].text = textField.text! 
       print("--set value at index \(index)") 

      } 
     } 

    } 

} 
+0

あなたのcellForRowAtIndexPathに、あなたのtextFieldsのデリゲートを設定しましたか?別の考え - > http://stackoverflow.com/a/22063354/4475605 – Adrian

+0

hmmm .. ViewControllerの** ViewDidLoad **にテーブル代理人を置く。 TextFieldデリゲートを**カスタムのCellクラスの** override init(**)に入れました。カスタムセルクラスにTextFieldデリゲートを持たず、その代わりにViewControllerにtheTextFiledデリゲートを持たせ(VC内でUITextFieldDelegateを実装する)必要がありますか? 4475605への参照のためにあなたは精緻化することができますか?私は、編集が完了した後に呼び出されるtextFiled ** didSelectRowAtIndexPath **(私はそう思わない)の新しい値でテーブルがロードされているデータ配列を更新できるので、セルの編集が完了したときを知る必要がある。 – john

+0

更新textFieldを動かす際の 'UITextField'のタグは? 2つの 'indexPaths'にある' UITextField'の 'moveRowAtIndexPath'デリゲートと更新タグを使用してください。 – Rikh

答えて

0

の終わりを強制するために、顧客のセルクラスに要求を中に押し込む場合でも、私はこの....

func textFieldDidEndEditing(_ textField: UITextField) { 
    let cell: UITableViewCell = textField.superview as! UITableViewCell 
    let textFieldIndexPath = tableView.indexPath(for: cell) 
    if let index = textFieldIndexPath?.row { 
     if index >= 0 && index < quizListItems.count { 
      // Stuff the input textField value in to the array that loads the table 
      quizListItems[index].text = textField.text! 
     } 
    } 
} 

注意をしました私のカスタムUITableViewCellクラスではありません。

他に何が失敗しましたか? didSelectRowとdidDeselectRowを使って試しました。しかし、UITextFieldがクリックを食べるので、これらは決して呼び出されません。 didSelectパスとのコンボで、フィールドをクリックするまで、UITextFieldを無効にするか、ユーザーアクションを受け付けないようにしました。これは混乱でした。何らかの理由で、didSelectとdidDeselectの内部でセルを取得しようとするとエラーが発生します。

は、textFieldDidEndEditingのUITextFieldデリゲートメソッドに戻り、インデックスを取得するためにセルに逆戻りしました。これは動作し、私は行を移動しても動作します。

このパスは、UITextFieldからセルに戻ってから、セルのインデックスを取得します。

関連する問題