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

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

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

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

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

Swift

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

Q&A

解決済

1回答

767閲覧

Swift5 textFieldShouldReturnの実装

saku_panda

総合スコア20

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

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

Swift

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

0グッド

0クリップ

投稿2019/10/24 06:48

編集2019/10/24 06:52

##前提・実現したいこと

TextFieldへ文字を入力する際に、開業ボタンを押されたらキーボードが閉じられる実装にしたいです。
しかし、エラー(後述)が出てしまいコンパイルが通りません。

##発生している問題・エラー文

  1. エラー文

Invalid redeclaration of 'textFieldShouldReturn'
2. ワーニング文
Instance method 'textFieldShouldReturn' nearly matches optional requirement 'textFieldShouldClear' of protocol 'UITextFieldDelegate'
Make 'textFieldShouldReturn' private to silence this warning

##該当のソースコード

Swift5

1import UIKit 2 3class ViewController: UIViewController { 4 private let Log = Logger(category: "ViewCtrl" )! 5 6 var sendMssView: UITableView = UITableView(frame: CGRect(x: 0,y: 0,width: 410,height: 600), style: UITableView.Style.plain) // 送信メッセージのテーブルビュー 7 var mssBox: UITextField = UITextField(frame: CGRect(x: 5, y: 750, width: 275, height: 25)) // 送信するメッセージを入力するフォーム 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 /* TableViewの初期化 */ 13 sendMssView.delegate = self 14 sendMssView.dataSource = self 15 sendMssView.register(UITableViewCell.self, forCellReuseIdentifier: "myCell") //Cellを登録する 16 self.view.addSubview(sendMssView) 17 18 /* TextField初期化 */ 19 mssBox.delegate = self 20 mssBox.text = "your message" // メッセージボックス内の文字 21 mssBox.borderStyle = .roundedRect // メッセージボックスのか枠線 22 mssBox.clearButtonMode = .whileEditing // 文字を全消しするボタン 23 self.view.addSubview(mssBox) 24 25 } 26} 27 28/* UITableViewの拡張 */ 29extension ViewController: UITableViewDelegate, UITableViewDataSource { 30 31 /* recvMssViewのセルの行数を指定する */ 32 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 33 return MessageList.sendMssList.count // リスト内の格納分を提供 34 } 35 36 /* sendMssViewのセルの中身を指定する */ 37 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 38 // 文字を表示するセルを取得する 39 let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 40 // セルの中身を設定する 41 cell.textLabel!.text = MessageList.sendMssList[indexPath.row] 42 return cell 43 } 44 45 func addMssToView (){ 46 DispatchQueue.global(qos: .userInitiated).async { 47 DispatchQueue.main.async { 48 self.sendMssView.reloadData() 49 } 50 } 51 } 52 53} 54 55extension ViewController: UITextFieldDelegate { 56 57 /* 入力用キーボードをEnterで非表示にする */ 58 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 59 textField.resignFirstResponder() 60 return true 61 } 62 63 /* 64 UITextFieldが編集された直前に呼ばれる 65 */ 66 func textFieldDidBeginEditing(_ textField: UITextField) { 67 Log.i("mssBox Begin") 68 if textField == mssBox { 69 MessageList.sendMss = textField.text! 70 } 71 } 72 73 /* 74 UITextFieldが編集された直後に呼ばれる 75 */ 76 func textFieldDidEndEditing(_ textField: UITextField) { 77 if textField == mssBox { 78 Log.i("mssBox End") 79 80 } 81 } 82}

##自分で調べたことや試したこと

ワーニング文ではprivateにするよう促してきますが、
他所でこのように直すとうまく機能しなくなること、
https://teratail.com/questions/213709

textFieldShouldClearは今回実装したい機能とは全く別のものであることも確認しています。
https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619603-textfieldshouldreturn
https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619594-textfieldshouldclear

##使っているツールのバージョンなど補足情報
Swift 5.0
Xcode 11.0
iOS 12.3
MacOS Mojave 10.14.6

都合上、アップデートができません。
ご助力いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
ViewController内に該当コードをもう一つ書いており、
重複しておりました。
消したところ、正しく動作しました。

投稿2019/10/24 07:00

saku_panda

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問