33552


TableView内のセルにTextFieldを配置し、パスワード変更画面のような画面を作成したいのですが、初心者のためうまく作成することができません。

記載したソースコードは下記のとおりですが、シュミレータで起動するとうまく動作しません。

下記の画像のとおり、各セルを選択した際に表示が意図しない動きとなってしまします。

期待する動作としては、各セルを選択した際に、TextFieldがフォーカス状態となる状態を期待しております。

ChangePasswordViewController.swift

[code]

     class ChangePasswordViewController: UIViewController,UITableViewDelegate, UITableViewDataSource {
    
        //データ
        var dataInSection = [["現在のパスワード"],["新しいパスワード","パスワードを確認"]]
        //セクション
        var sectionIndex:[String] = ["",""]
    
        //データを返す
        func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "PasswordCell", for:indexPath as IndexPath) as! ChangePasswordTableViewCell
            var section = dataInSection[indexPath.section]
            cell.textLabel?.text = section[indexPath.row]
            return cell
        }
    
        //データの個数を返す
        func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
            return dataInSection[section].count
        }
    
        //セクション名を返す
        func tableView(_ tableView:UITableView, titleForHeaderInSection section:Int) -> String?{
            return sectionIndex[section]
        }
    
        //セクションの個数を返す
        func numberOfSections(in tableView: UITableView) -> Int {
            return sectionIndex.count
        }
    
        // Cell が選択された場合
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let cell = tableView.dequeueReusableCell(withIdentifier: "PasswordCell", for:indexPath as IndexPath) as! ChangePasswordTableViewCell
           cell.becomeFirstResponder()
    
        }
    }
    
[/code]

ChangePasswordTableViewCell.swift

[code]

    class ChangePasswordTableViewCell: UITableViewCell {
    
        @IBOutlet weak var passwordTextField: UITextField!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
        }
    
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
    
            // Configure the view for the selected state
        }
    
    }
    
[/code]

■シュミレータでの表示時  
[![画像の説明をここに入力](https://i.stack.imgur.com/0KshP.png)](https://i.stack.imgur.com/0KshP.png)

■シュミレータで各セルを選択時  
[![画像の説明をここに入力](https://i.stack.imgur.com/FC2pU.png)](https://i.stack.imgur.com/FC2pU.png)


CC BY-SA 3.0
2017-03-26T09:31:05.490
33548
2017-03-26T11:14:59.973
2017-03-26T10:41:13.200
76
8489
question
swift ios swift3
TableView内のセルにTextFieldを配置し値を取得・表示させたい

[code]

    // Cell が選択された場合
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PasswordCell", for:indexPath as IndexPath) as! ChangePasswordTableViewCell
       cell.becomeFirstResponder()
    }
    
[/code]

このメソッドの`let cell =
tableView.dequeueReusableCell(withIdentifier:〜`が間違いです。メソッド`dequeueReusableCell(〜)`は、`UITableViewDataSource`のメソッド`func
tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath) ->
UITableViewCell`だけで用いるものと理解してください。  
もうひとつ。`becomeFirstResponder()`を送るオブジェクトは、セルではなく、テキストフィールドです。  
改善したコードはこうなります。

[code]

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) as? ChangePasswordTableViewCell {
            cell.passwordTextField.becomeFirstResponder()
        }
    }
    
[/code]


CC BY-SA 3.0
2017-03-26T11:14:59.973
33552
2017-03-26T11:14:59.973
18540
33548
answer