前提・実現したいこと

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:

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)
    }

}

TableViewCell.swift:

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
    }

}

編集画面:
画像の説明をここに入力