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

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

ただいまの
回答率

91.25%

  • Swift

    5311questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iOS

    3068questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    3026questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

NavigationBarの編集ボタンが押されたらTableViewCell内のtextFieldを編集可能にする方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 38

TakeYourMark

score 2

前提・実現したいこと

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
    }

}

以上、よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

cellForRowAt内で編集できるか否かを設定するようにしましょう。

 cell.textField.isEnabled = isEditable

編集ボタンが押されたら

isEditableをtrue または falseに切り替えて、以下のコマンドでテーブルを更新しましょう。

ttableView.reloadData()

reloadDataによりTableViewに表示されるCellが再読み込みされるので、
各cellに対してcellForRowAtが呼び出されて編集モードが切り替わるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 22:50

    教えて頂いた方法で実現できました。ご回答ありがとうございます。

    キャンセル

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

ただいまの回答率

91.25%

関連した質問

同じタグがついた質問を見る

  • Swift

    5311questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iOS

    3068questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    3026questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。