

## 前提・実現したいこと

Xcode ver9.2 、 Swift で iOS アプリを開発しています。

NavigationBar 右上の編集ボタンが押されたら、 TableViewCell 内の textField を編集可能にする方法を教えてください。

* * *

## 発生している問題

オブジェクトの配置とコード（括弧内）の関係:

  * NavigationController 
    * TableViewController (`TableViewController.swift`) 
      * TableViewCell (`TableViewCell.swift`) 
        * TextField

初期表示では TextField が編集できないように、 `TableViewCell.swift` 内の `awakeFromNib()` で
`textField.isEnabled = false` と設定しています。

編集ボタンが押されたら、 TextField を編集できるように、 true に設定したく、方法を教えて頂けませんでしょうか？

* * *

## 該当のソースコード

`TableViewController.swift`:

[code]

    import UIKit
    
    class TableViewController: UITableViewController, TableViewCellDelegate {
    
        @IBOutlet var ttableView: UITableView!
    
        var array:[String] = ["あああ", "いいい", "ううう", "えええ", "おおお"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Uncomment the following line to preserve selection between presentations
            // self.clearsSelectionOnViewWillAppear = false
    
            // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
            self.navigationItem.rightBarButtonItem = self.editButtonItem
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        override func setEditing(_ editing: Bool, animated: Bool) {
            super.setEditing(editing, animated: animated)
        }
    
        // MARK: - Table view data source
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            // #warning Incomplete implementation, return the number of sections
            return 1
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            // #warning Incomplete implementation, return the number of rows
            return array.count
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "inputCell", for: indexPath) as! TableViewCell
            cell.textField.text = array[indexPath.row]
            // デリゲート設定
            cell.delegate = self
            return cell
        }
    
        // テキストフィールド編集後
        func textFieldDidEndEditing(cell: TableViewCell, value: String) -> () {
            let path = tableView.indexPathForRow(at: cell.convert(cell.bounds.origin, to: tableView))
            array[(path?.row)!] = value
        }
    
        // 削除ボタン押下後
        override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
            if (editingStyle == UITableViewCellEditingStyle.delete) {
                array.remove(at: indexPath.row)
                tableView.deleteRows(at: [indexPath], with: .fade)
            }
        }
    
        override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    
            let cell = tableView.cellForRow(at: sourceIndexPath) as! TableViewCell
            let moveData = cell.textField.text
            array.remove(at: sourceIndexPath.row)
            array.insert(moveData!, at: destinationIndexPath.row)
        }
    
    }
    
[/code]

`TableViewCell.swift`:

[code]

    import UIKit
    
    // プロトコル
    protocol TableViewCellDelegate {
        func textFieldDidEndEditing(cell: TableViewCell, value: String) -> ()
    }
    
    class TableViewCell: UITableViewCell, UITextFieldDelegate {
    
        var delegate: TableViewCellDelegate! = nil
    
        // テキストフィールド接続
        @IBOutlet weak var textField: UITextField!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // テキストフィールドデリゲート
            textField.delegate = self
            // テキストフィールド入力キーボードの改行を完了に変更
            textField.returnKeyType = .done
            // 右上の編集ボタンが押される前はテキストフィールドを編集不可に設定
            textField.isEnabled = false
        }
    
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
    
            // Configure the view for the selected state
        }
    
        // テキストフィールド編集後デリゲート
        func textFieldDidEndEditing(_ textField: UITextField) {
            self.delegate.textFieldDidEndEditing(cell: self, value: textField.text!)
        }
    
        // リターンキー押下後デリゲート
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return true
        }
    
    }
    
[/code]

編集画面:  
[![画像の説明をここに入力](https://i.stack.imgur.com/7xRy1.png)](https://i.stack.imgur.com/7xRy1.png)


CC BY-SA 4.0
2018-01-04T02:17:39.590
40706
2021-12-26T14:02:15.220
2019-05-05T16:14:52.937
29826
26867
question
swift ios
NavigationBarの編集ボタンが押されたらTableViewCell内のtextFieldを編集可能にする方法


CellのawakeFromNib()での`textField.isEnabled =
false`は不要なので削除し、TableViewControllerのCellForRowAtにて、`cell.textField.isEnabled =
self.isEditing`すればひとまずは解決だと思います。


CC BY-SA 3.0
2018-01-13T12:53:43.660
40933
2018-01-13T12:53:43.660
427
40706
answer