NavigationBarの編集ボタンが押されたらTableViewCell内のtextFieldを編集可能にする方法
前提・実現したいこと
Xcode ver9.2 、 Swift で iOS アプリを開発しています。
NavigationBar 右上の編集ボタンが押されたら、 TableViewCell 内の textField を編集可能にする方法を教えてください。
発生している問題
オブジェクトの配置とコード(括弧内)の関係:
- NavigationController
- TableViewController (
TableViewController.swift
)- TableViewCell (
TableViewCell.swift
)- TextField
- TableViewCell (
- TableViewController (
初期表示では 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
}
}