2017-07-31 27 views
0

テキストフィールドでカスタムテーブルビューセルに問題があります。だから、私はテキストフィールドを持つセルのための別のクラスが、私は私のtableviewクラス内のデータを取得することはできません。 tableviewクラスとtextFieldShouldReturn関数にはテキストフィールドの代理人がありますが、 "完了"ボタンを押しても何も起こりません。どこに問題がありますか?カスタムuitableviewセルからuitextfieldデータを取得する - Swift

ありがとうございます!

class MainTVC: UITableViewController, UITextFieldDelegate{ 

    var tableParts: [Dictionary<String, Any>] = [] 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     tableParts = [ 
      ["type": "title", "data": "Some data", "enabled": true], 
      ["type": "date", "data": "Some data", "enabled": true], 
      ["type": "location", "data": "Loading...", "enabled": true], 
     ] 
     tableView.reloadData() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { return 1 } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tableParts.count } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var cell = tableParts[indexPath.row] 
     switch(cell["type"] as! String) { 
     ... 
     case "textbox": 
      let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell 
      rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text" 

      rTemplateTextBox.data = cell 
      return rTemplateTextBox 
     default: 
      let cell = tableView.dequeueReusableCell(withIdentifier: "defCell", for: indexPath) 
      cell.textLabel?.text = "Unknown type of cell!" 
      return cell 
     } 

    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     print("Should return!") 
     return true 
    } 
} 

とセル用:ここ

はテーブル表示のた​​めのコードです

class RTextCell: UITableViewCell, UITextFieldDelegate { 

    var textField = UITextField() 
    var data: Dictionary<String, Any>? 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     textField.delegate = self 

     let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height)) 

     textField = UITextField(frame: CGRect(x:0, y:0, width: self.frame.width, height: 40)) 
     textField.placeholder = "Your text here" 
     textField.textColor = UIColor.white 
     textField.tintColor = UIColor.white 
     textField.backgroundColor = UIColor.clear 
     textField.leftView = padding 
     textField.leftViewMode = .always 

     self.addSubview(textField) 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     print("Should return") 
     return true 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
     if data != nil { 
      data!["data"] = textField.text 
      print("DATA: \(data!)") 
     } else { 
      print("No data") 
     } 
    } 
} 
+0

あなた 'UITableViewCell'サブクラスとあなたのテーブルビューコントローラクラスの両方に関連するコードを記載してください。 –

+0

@Cheslav私の答えはあなたの問題を解決すると思う –

+0

RTextCellクラスでtextfield.delegateを設定しています。したがって、textFieldShouldReturnはそのクラスでのみ動作します。あなたはどこのテキストフィールドのデータを使用しますか? plsは説明しますか? –

答えて

0

最初の問題 - セルクラスでawakeFromNib()あなたが持っている:あなたはNEW TextFieldを作成するときに

// CREATE a UITextField 
var textField = UITextField() 
var data: Dictionary<String, Any>? 

override func awakeFromNib() { 
    super.awakeFromNib() 

    // assign self as the delegate of textField 
    textField.delegate = self 

    let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height)) 

    // CREATE a NEW UITextField 
    textField = UITextField(frame: CGRect(x:0, y:0, width: self.frame.width, height: 40)) 

だから、それはもはや、それに割り当てられたデリゲートを持っていません。だからこそ何もtextFieldShouldReturnまたはtextFieldDidEndEditingをトリガーしません。代わりに、その後、試してみて、操作し、コールバッククロージャを使用して考えるように、「データ・オブジェクト」に渡すのでは、

textField.frame = CGRect(x:0, y:0, width: self.frame.width, height: 40) 

次へ:

はとUITextField(frame: ..)ラインを交換してください。

class RTextCell: UITableViewCell, UITextFieldDelegate { 

    var textField = UITextField() 

    // this will be our "call back" closure 
    var didEndEditAction : ((String)->())? 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     textField.delegate = self 

     let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height)) 

     // just set the frame, don't create a NEW textField 
     textField.frame = CGRect(x:0, y:0, width: self.frame.width, height: 40) 
     textField.placeholder = "Your text here" 
     textField.textColor = UIColor.white 
     textField.tintColor = UIColor.white 
     textField.backgroundColor = UIColor.clear 
     textField.leftView = padding 
     textField.leftViewMode = .always 

     self.addSubview(textField) 

    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     print("Should return") 
     return true 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
     // call back using a closure 
     didEndEditAction?(textField.text ?? "") 
    } 

} 

をし、このようにそれを設定します:

はこれにあなたのセルクラスを変更

case "textbox": 
     let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell 
     rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text" 

     // setup the "call back" closure 
     rTemplateTextBox.didEndEditAction = { 
      (newText) in 
      let cell = self.myData[indexPath.row] 
      cell["data"] = newText 
     } 

     return rTemplateTextBox 
+0

ありがとうございました!!! – Cheslav

0

あなたのtableViewはちょうど次のコード

を使用すると宣言された任意の場所にセル textFieldデータを取得することができます
let indexPath = IndexPath(row: yourRow, section: yourSection) 
let cell:InputDataCell = yourTable.cellForRow(at: indexPath) as! InputDataCell 

if (cell.yourTextFieald.text?.characters.count)! { 
    print(cell.yourTextFieald.text!)       
} 
関連する問題