質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

6433閲覧

UITableViewCell内のTextFieldの値を取得したい

mochi9902

総合スコア29

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/24 03:21

UITableViewCell内にTextFieldを配置し、
改行、もしくはタップしたタイミングで入力した値を取得したいです。

具体的には、カスタムのUITableViewCellクラスであるTextFieldEditCellクラスを定義し、そこにUILabelとUITextFieldを設置、さらにカスタムのDelegateとしてTextFieldEditCellDelegateをprotcolとして追加しました。
対象のViewControllerにUITableViewを設置し、そのセルに上記のクラスを設定。
TextFieldEditCellDelegateで定義したtextFieldDidEndEditingメソッドを呼び出して入力した値を取得します。

以下のソースコードでは、UserOptionTableViewController.swiftのtextFieldDidEndEditingメソッドが呼び出されず、入力した値が取得できていない状態です。

どうすれば、メソッドを呼び出すことができるのでしょうか?
ご教授お願いします。

TextFieldEditCell.swift

swift

1import UIKit 2 3protocol TextFieldEditCellDelegate: class { 4 func textFieldDidEndEditing(cell: TextFieldEditCell, value: NSString) 5} 6 7class TextFieldEditCell: UITableViewCell, UITextFieldDelegate { 8 9 @IBOutlet weak var titleLabel: UILabel! 10 @IBOutlet weak var textField: UITextField! 11 weak var delegate: TextFieldEditCellDelegate! = nil 12 13 override func awakeFromNib() { 14 super.awakeFromNib() 15 // Initialization code 16 } 17 18 override func setSelected(selected: Bool, animated: Bool) { 19 super.setSelected(selected, animated: animated) 20 21 // Configure the view for the selected state 22 } 23 24 func setCell(name: String, value: String?) { 25 titleLabel.text = name 26 textField.text = value 27 } 28 29 internal func textFieldShouldReturn(textField: UITextField) -> Bool { 30 textField.resignFirstResponder() 31 return true; 32 } 33 34 internal func textFieldDidEndEditing(textField: UITextField) { 35 self.delegate.textFieldDidEndEditing(self, value: textField.text!) 36 } 37} 38

UserOptionTableViewController.swift

swift

1class UserOptionViewController: UIViewController, UITableViewDelegate,UITableViewDataSource, TextFieldEditCellDelegate { 2 3 var optionEntity: OptionEntity = OptionEntity(); 4 var viewData: Array<OptionProperty> = [] 5 @IBOutlet weak var optionDataTableView: UITableView! 6 @IBAction func saveTransaction(sender: AnyObject) { 7 8 } 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 let transaction = PostDataTransaction() 14 transaction.selectOption("xxx@gmail.com") 15 16 let defaults = NSUserDefaults.standardUserDefaults() 17 if let data = defaults.objectForKey("optionData") { 18 let optionData: NSData = data as! NSData 19 do { 20 let optionDataObj: NSDictionary = try NSJSONSerialization.JSONObjectWithData(optionData, options: NSJSONReadingOptions.AllowFragments) as! NSDictionary 21 22 optionEntity.setAccountName(optionDataObj["accountname"] as! String) 23 optionEntity.setPassword(optionDataObj["password"] as! String) 24 optionEntity.setSmtphost(optionDataObj["smtphost"] as! String) 25 optionEntity.setSmtpuser(optionDataObj["smtpuser"] as! String) 26 optionEntity.setSmtppassword(optionDataObj["smtppassword"] as! String) 27 optionEntity.setSmtpssl(optionDataObj["smtpssl"] as! String) 28 optionEntity.setSmtpauth(optionDataObj["smtpauth"] as! String) 29 optionEntity.setSmtpport(optionDataObj["smtpport"] as! String) 30 } catch { 31 // error 32 } 33 } 34 35 viewData = optionEntity.toArrayForView() 36 //let optionDataTableView = UITableView(frame: view.frame, style: .Grouped) 37 optionDataTableView.delegate = self 38 optionDataTableView.dataSource = self 39 //optionDataTableView.allowsSelectionDuringEditing = true 40 } 41 42 override func didReceiveMemoryWarning() { 43 super.didReceiveMemoryWarning() 44 // Dispose of any resources that can be recreated. 45 } 46 47 // MARK: - Table view data source 48 49 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 50 // #warning Incomplete implementation, return the number of sections 51 return 2 52 } 53 54 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 55 // #warning Incomplete implementation, return the number of rows 56 if section == 0 { 57 return 2 58 } 59 return 5 60 } 61 62 // セクションのタイトル 63 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 64 if(section == 0) { 65 return "アカウント情報" 66 } else { 67 return "SMTP情報" 68 } 69 } 70 71 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 72 let cell: TextFieldEditCell = tableView.dequeueReusableCellWithIdentifier("optionCell", forIndexPath: indexPath) as! TextFieldEditCell 73 cell.delegate = self 74 if indexPath.section == 0 { 75 cell.setCell(viewData[indexPath.row].key, value: viewData[indexPath.row].value) 76 } else { 77 cell.setCell(viewData[indexPath.row + 2].key, value: viewData[indexPath.row + 2].value) 78 } 79 return cell 80 } 81 82 // 入力が終わったタイミングで以下のメソッドが実行し、入力した値を取得したいが、実行されていない状態。 83 func textFieldDidEndEditing(cell: TextFieldEditCell, value: NSString){ 84 let path = optionDataTableView.indexPathForRowAtPoint(cell.convertPoint(cell.bounds.origin, toView: optionDataTableView)) 85 print("row=%d, value = %@", path!.row, value) 86 //NSLog("row=%d, value = %@", path!.row, value) 87 } 88

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

試してませんが、セルのTextFieldのdelegateが設定されていますか?
Storyboardで設定されているのでした違う原因だと思いますが、確認してください。

swift

1override func awakeFromNib() { 2 super.awakeFromNib() 3 textField.delegate = self 4}

投稿2016/07/24 04:12

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochi9902

2016/07/24 06:00

ありがとうございます。 おかげで解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問