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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

3662閲覧

【Swift】TextFieldへ入力した後にReturnキーを押して、入力内容をlabelに表示したい

foxkun

総合スコア17

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グッド

0クリップ

投稿2019/01/18 12:55

【Swift】TextFieldへ入力した後にReturnキーを押して、入力内容をlabelに表示したい

今回が初投稿なので、見づらい点や見苦しいところなどはご了承ください。

TextFieldに文字を入力し、Returnキーを押すとlabelに入力内容が表示される。
またその入力内容はUserDefaultによってアプリ終了後も保存され、再起動するとそれを読み込みlabelに表示する、

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

TextFieldへ入力した後にReturnキーをおしても、textFieldShouldReturnメソッドが実行されない

該当のソースコード

Swift

1 2import UIKit 3 4class ViewController: UIViewController, UITextFieldDelegate { 5 6 @IBOutlet weak var showLabel: UILabel! 7 @IBOutlet weak var textField: UITextField! 8 9 let userDefaults = UserDefaults.standard 10 var content: String? 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 // Do any additional setup after loading the view, typically from a nib. 15 16 let lastMyData: String? = userDefaults.object(forKey: "myData") as? String 17 18 if let lastMyDataStr = lastMyData { 19 textField.text = lastMyDataStr 20 } else { 21 return 22 } 23 textField.delegate = self 24 } 25 26 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 27 28 content = textField.text! 29 showLabel.text = content 30 userDefaults.set(content, forKey: "myData") 31 userDefaults.synchronize() 32 textField.resignFirstResponder() 33 34 return true 35 } 36 37}

試したこと

UserDeafultによる保存機能が邪魔しているのかもしれないと思い、それらを取り除くと問題なくtextFieldShouldReturnメソッドは実行されました。

補足情報(FW/ツールのバージョンなど)

Xcode 10.1
Swift 4.2.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

書いてあるコードの意味を理解していますか?
どこかからコピーしてきたのですか?
その解説はよく読みましたか?
かなり無駄の多いコードとなっていますよ。

Swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 // Do any additional setup after loading the view, typically from a nib. 4 5 textField.delegate = self // ①これがいつでも実行されるように先頭に持ってくる 6 textField.text = UserDefaults.standard.string(forKey: "myData") 7} 8 9func textFieldShouldReturn(_ textField: UITextField) -> Bool { 10 showLabel.text = textField.text! 11 UserDefaults.standard.set(textField.text!, forKey: "myData") 12 textField.resignFirstResponder() 13 return true 14}

これでいいはずですよ。
ちなみに書くと、returnがあると、そこでコードを終わりにすることになるので、
viewDidLoadがそこで終わるので、textFieldのdelegateが設定されず、
shouldReturnのfunctionが機能しなくなってしまうんですよ。

投稿2019/01/18 15:32

編集2019/01/18 15:37
hameji001

総合スコア639

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

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

foxkun

2019/01/19 00:11

修正されたコードが非常にすっきりしているもので驚きました。おっしゃるとおりコピペ、というか参考にしたサイトのコードをあまり理解せずに使ってしまいましたし、またそのサイトはあまり解説が詳しいとは言えないものでした。 returnについても同様でただif文やif else文が終わるだけだと勘違いしていました。もっと基礎文法を確認してみます。回答ありがとうございました!
foxkun

2019/01/19 00:23

すみません、実はまだ聞きたいことがありましてUserDefaultクラスはなぜインスタンス化しないのでしょうか。また、.setメソッドでKey"myData"を使って値を保存しましたが、引数はAny?型であり、再起動時に.stringメソッドで読み込みますが、textfieldのtextプロパティはString?型です。なぜ型変換しないのでしょうか? よろしくお願いします。
hameji001

2019/01/19 05:12

UserDefaultsはインスタンス化してもいいですが、特に意味はなく コードも長くなる元なので、インスタンス化していません。 それよりswiftらしく使いたい、 extentionを用意するって記事よくみますよね。 また、保存する時に関しては https://dev.classmethod.jp/smartphone/swift-3-0-userdefaults/ を参考いただければですが、 swift側での推測機能により、敢えて書かなくても良くなったのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問