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

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

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

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

Xcode

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

Swift

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

Q&A

解決済

1回答

1395閲覧

【swift】ボタンを押したらカスタムセルにあるtextFieldにカーソルを当てたい

nkrmn_a

総合スコア27

iOS

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

Xcode

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

Swift

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

0グッド

1クリップ

投稿2020/02/27 06:34

編集2020/02/27 06:38

前提・実現したいこと

現在、カスタムセルにtextFieldを設置し、セル内に入力できるようになっています。
セル数は可変で、ボタンを押すとセルが追加され、追加されたセル(に設置されているtextField)にユーザーが入力できるようになっています。

発生している問題・エラーメッセージ

ボタンを押したとき、追加されたセルにあるtextFieldにカーソルを当て、キーボードを表示したいです。

該当のソースコード

swift

1// カスタムセル 2class CustomCell: UITableViewCell, UITextFieldDelegate { 3 var order: Int = 0 4 var parentView: ParentViewController! 5 6 @IBOutlet weak var cellTextField: UITextField! 7 8 // テキスト編集完了 9 func textFieldDidEndEditing(_ textField: UITextField) { 10     //入力値をリストに追加 11 parentView.inputCellView(at: order, text: self.cellTextField.text ?? "") 12 } 13 14 // 編集中 15 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 16 parentView.inputCellView(at: order, text: self.cellTextField.text ?? "") 17 18 return true 19 } 20 21}

swift

1// セルのインスタンスを生成する 2 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 3 4 // 品番セルを生成 5 let cell: hnbnCell = tableView.dequeueReusableCell(withIdentifier:"hnbnCell") as! hnbnCell 6 7 cell.hnbnTextField.text = hnbnList[indexPath.row] 8 cell.hnbnTextField.delegate = cell 9 cell.parentView = self 10 cell.order = indexPath.row 11 12 return cell 13 } 14

swift

1 //セル追加ボタン押下時 2 @IBAction func addCellButtonPushed(_ sender: Any) { 3 // dataを追加 4 textList.append("") 5 6 // リロード 7 self.textTableReload() 8 }

試したこと

色々ググってみましたがさっぱりわからず……
textField.becomeFirstResponder()なども記述してみましたが動かず、お手上げ状態です。

拙い質問で申し訳ありませんが教えてくださいませ。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

適当ですが、一つの方向性として。

swift

1 2// ボタンを押してセルを追加し、reloadData()もしくはinsertRowの処理が完了したあとに、 3 4// 追加されたセルのインデックスパスを取得(詳細わからんので適当にインデックスパスをつくる) 5let indexPath = IndexPath(row: tetextList.count - 1, section: 0) 6// 追加したセルを捕まえる 7let cell = hogeTableView.cellForRow(at: indexPath) as? CustomCell 8// 捕まえたセルにあるテキストフィールドをファーストレスポンダにする 9cell?. cellTextField.becomeFirstResponder() 10 11 12

ってやってみたらどうでしょうか?
追加したセルが画面からはみ出てるときとかのことも考えてあげてください。

と書きましたが、

@IBAction func addCellButtonPushed(_ sender: Any)sender
タップされたボタンの情報が送られてくるので、その親viewの上に乗ってるテキストフィールドを
ファーストレスポンダにするってほうが早いかも。
こっちもviewの描写が完了したあとにアクセスするようにしてみてください。

投稿2020/02/27 07:38

編集2020/02/27 07:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nkrmn_a

2020/02/27 08:07

書いてくださったコードの通りやってみたらできました!ありがとうございます。 reloadData()の後に記述しないといけなかったのですね…。 追加したセルを捕まえる記述が思いつかなかったので助かりました。勉強になります。 追記してくださったほうのやり方については、テキストフィールドがセルを経由しないとアクセスできないように実装してしまったので、今回はできませんでした。また違うやり方を教えていただけて感謝です。次回似た状況になった時の参考にしたいと思います。
退会済みユーザー

退会済みユーザー

2020/02/27 09:26

動くならいいんだけど、後に記述じゃなくて、画面の更新処理が完了してから実行させると考えてくださいな。処理によってはそうじゃないと動かないことが出てくると思うので。 後述の方は、senderからセルを経由してアクセスできると思うけど、まあいっか。
nkrmn_a

2020/03/02 10:30

なるほど、画面更新処理してきれいな画面になった後、キーボードを表示させる状態を維持させる、みたいなイメージでしょうか。 senderの方、やってみようと思ったのですが、senderが持っているのがselfだけでどう使えばよいのか分からなかったのですが、この場合senderはなにを保持しているのでしょうか?
退会済みユーザー

退会済みユーザー

2020/03/02 10:52

ごめんなさい、senderの方は私の勘違いです。 ぼーっと回答書いてるうちに、cellの上に追加ボタンが乗ってるのと勘違いしてしまっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問