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

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

ただいまの
回答率

88.83%

swiftでのcustomcellの値を取得したい

解決済

回答 2

投稿

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

hkbto

score 14

・やりたいこと
画面を遷移するタイミングで、tableView内のcellのテキストを全て取得したい。
理想としては、増やしたcell分のtextFieldの値をリストとして次の画面に引き継ぎたいです。

とても中途半端なコードとなっていますが、よろしくお願いします。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


    let myItems: NSMutableArray = []
    var itemCount = 0

    @IBOutlet weak var myTableView: UITableView!
    @IBOutlet weak var addButton: UIButton!
    @IBOutlet weak var toolbar: UIToolbar!
    override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.register (UINib(nibName: "customMainCells", bundle: nil),forCellReuseIdentifier:"cell")

        addCell()
        addCell()
    }


    @IBAction func touchAddButton(_ sender: Any) {
        addCell()
    }

    /*
     addButtonが押された際呼び出される
     */
    func addCell() {
        if(itemCount<10){

            // myItemsに追加.
            myItems.add("add Cell")

            // TableViewを再読み込み.
            myTableView.reloadData()

            itemCount = itemCount+1
        }
    }

    //追加③ セルの個数を指定するデリゲートメソッド(必須)
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myItems.count
    }

    //追加④ セルに値を設定するデータソースメソッド(必須)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cellContext = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! customMainCells
        cellContext.cellDisplay ( indexNum : indexPath )
        return cellContext
    }
    /*
     Cellを挿入または削除しようとした際に呼び出される
     */
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        // 削除のとき.
        if editingStyle == UITableViewCell.EditingStyle.delete {
            print("削除")

            // 指定されたセルのオブジェクトをmyItemsから削除する.
            myItems.removeObject(at: indexPath.row)

            // TableViewを再読み込み.
            tableView.reloadData()
        }
    }


    // ①セグエ実行前処理
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        /////////////////////////////////
        //この辺りで値を取得したいと思い、とりあえず1cell分だけと考えていろいろ試していますがよくわかりません
        /////////////////////////////////

        //Int型からIndexPath型にキャスト
        let indexPath = IndexPath(index: 1)
        //indexPathでセルを指定可能
        let cell = myTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! customMainCells

        let myText = cell.myTextView.text
        print(myText)
        //////////////////////////////////

        // ②Segueの識別子確認
        if segue.identifier == "resultSegue" {

        }
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
import UIKit

class customMainCells: UITableViewCell {
    @IBOutlet weak var myTextView: UITextField!



    func cellDisplay(indexNum: IndexPath){
        self.myTextView.text = String(indexNum.row)
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

func addCell()で情報がmyItemに格納されているので、わざわざセルにアクセスせずに
遷移をするタイミングで(override func prepare(:,:)内でいいかな? )
情報が格納されている配列myItemsからindex指定によって取得、それを遷移先のVCに渡してあげてください

// 選択済みセルのインデックスを持っているとして

//セル一つ分ならStringの定数に格納(myTableView.allowsSelection = trueなんかの場合)

guard let indexPath: IndexPath
     =  myTableView.indexPathForSelectedRow?.first else { return }
let cellStr: String = myItems[indexPath.row] // => cellStrを遷移先VCに送る

//複数セル分ならStringの配列に格納(myTableView.allowsMultipleSelection = trueなんかの場合)

guard let indexes [IndexPath] 
    =  myTableView.indexPathForSelectedRow else { return }
let cellStrs: [String] = indexes.map { myItems[$0.row] } // => cellStrsを遷移先VCに送る

// 質問のコードに書いてあるインデックス1の場合

let index: Int = 1 //(配列の2番めの要素のため、配列の要素が1つの場合は動きません、気をつけて)

let myText = myItem[index]

// ここに直打ちしたのでエラーがあったらごめんね

値を取得するこの場面ではデリゲートは必要ありません。

textFieldうんぬんについては、コード上にありませんので、textFieldをセルに乗せて動かしてから考えてください。カスタムセル内はUILabelでなく、UITextFieldでした、読んでなくてごめんなさい。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/14 20:22 編集

    確かにおっしゃる通り、MyItemを渡せばいいですね、、、

    キャンセル

0

検索してみると、出て来るこれで自分も最初勉強しました。
http://an.hatenablog.jp/entry/2015/10/04/015712

要はDelegateというものがわかればできます。

追記

完全に間違ってました。
てっきり、「Custom Cellで入力したUITextFieldの値を取得したい」と
言うことだと勘違いしていました。

次のviewにデータを渡すには他の方が答えている通り、
segueを利用し、選んでいるcellのindexをもとに
MyItemsの該当indexの中身を渡せば事足ります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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