前提・実現したいこと
xcodeでアプリを作っています。TableViewCellの中にTextFieldを配置して入力された値を取得したいのですが、エラーが出てしまいうまくいきません。
テキストフィールドに数字を入力して次のテキストフィールドをタップするとクラッシュします。
発生している問題・エラーメッセージ
testapp3[3948:200218] -[testapp3.EditView4Controller TextField:]: unrecognized selector sent to instance 0x7f9957d14c20 -[testapp3.EditView4Controller TextField:]: unrecognized selector sent to instance 0x7f9957d14c20 (null)
該当のソースコード(swift)
EditView4Controller.swift
1 2 3import UIKit 4 5 6struct Info_k: Codable { 7 var Item: String 8 var number: Int 9} 10 11class EditView4Controller: UIViewController, UITableViewDataSource, UITableViewDelegate, InputTextTableCellDelegate { 12 13 var tag: Int = 0 14 var cellIdentifier: String = "" 15 let storemanager = StoreManager() 16 var Items = [Info_k]() 17 18 @IBOutlet weak var tableView0: UITableView! 19 @IBOutlet weak var tableView1: UITableView! 20 @IBOutlet weak var button_save: UIButton! 21 22 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 Items = storemanager.load(key: "Items") 27 print(Items) 28 } 29 30 override func didReceiveMemoryWarning() { 31 super.didReceiveMemoryWarning() 32 } 33 34 func ChecktableView(_ tableView: UITableView) -> Void { 35 if(tableView.tag == 0) { 36 tag = 0 37 cellIdentifier = "InputTextCell0" 38 } else { 39 tag = 1 40 cellIdentifier = "InputTextCell1" 41 } 42 } 43 44 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 45 return Items.count 46 } 47 48 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { ChecktableView(tableView) 49 50 let cell: InputTextTableCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath ) as! InputTextTableCell 51 if tableView.tag == 0 { 52 cell.textLabel!.text = Items[indexPath.row].Item 53 } else { 54 cell.delegate = self 55 56 } 57 return cell 58 } 59 60 func tableView(tableView: UITableView, heightForRowAtIndexPath idexPath: NSIndexPath) -> CGFloat { 61 return InputTextTableCell.height() 62 } 63 64 65 66 func textFieldDidEndEditing(cell: InputTextTableCell, value: NSString) -> () { 67 68 69 let path = tableView1.indexPathForRow(at: cell.convert(cell.bounds.origin, to: tableView1)) 70 print(path!.row) 71 72 NSLog("row = %d, value = %@", path!.row, value) 73 74 } 75 76 77 78 @IBAction func button_save(_ sender: Any) { 79 80 storemanager.save(value: Items, key: "Items") 81 } 82} 83
InputTextTableCell.swift
1 2 3import UIKit 4 5protocol InputTextTableCellDelegate { 6 func textFieldDidEndEditing(cell: InputTextTableCell, value: NSString) -> () 7} 8 9class InputTextTableCell: UITableViewCell, UITextFieldDelegate { 10 11 12 13 var delegate: InputTextTableCellDelegate! = nil 14 15 override func awakeFromNib() { 16 super.awakeFromNib() 17 } 18 19 override func setSelected(_ selected: Bool, animated: Bool) { 20 super.setSelected(selected, animated: animated) 21 22 } 23 static func height() -> CGFloat { 24 return 75.0 25 } 26 27 internal func textFieldShouldReturn(textField: UITextField) -> Bool { 28 textField.resignFirstResponder() 29 return true 30 } 31 32 internal func textFielddidEndEiting(textField: UITextField) { 33 self.delegate.textFieldDidEndEditing(cell: self, value: textField.text! as NSString) 34 } 35} 36
Storyboardはこんな感じです。↓
試したこと
TextFielddidEndEditingの関数がおかしいのかと思い中身を消してみましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
macOS Catalina 10.15.3
xcode 11.3.1
EditView4Controller に対して TextField: というメソッドが呼ばれているようですが、Storyboard のどこかで設定されているのでしょうか?
ソースコードのどこの部分でしょうか?
TextFieldはTableViewCell内に配置しています。
[testapp3.EditView4Controller TextField:]: unrecognized selector sent というエラーが出そうな箇所が質問文中には見当たらなかったので、ストーリーボードを疑ってます。
Storyboardの画像を追加しました。よろしくお願いします。
TextFieldはSent Events 項のEditingDidEndとのみ接続を持っています。ClassはUITextFieldです。
回答1件
あなたの回答
tips
プレビュー