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

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

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

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

Q&A

解決済

1回答

678閲覧

【Swift4】Labelにユーザー名を表示させたい。

Kaguya_4869

総合スコア116

Swift

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

0グッド

0クリップ

投稿2019/07/21 11:11

#質問したいこと
サインアップの画面で設定したユーザー名を、ホーム画面のLabelに表示させるようにしたいです。
#コード

swift4

1//サインアップの画面.swift 2import UIKit 3import Firebase 4import FirebaseAuth 5 6class AccountViewController: UIViewController { 7 var acount: FirebaseApp! 8 9 @IBOutlet private weak var nameTextField: UITextField! 10 @IBOutlet private weak var emailTextField: UITextField! 11 @IBOutlet private weak var passwordTextField: UITextField! 12 13 var isFirst = true // 最初の処理かどうか 14 15 16 @IBAction private func didTapSignUpButton() { 17 let email = emailTextField.text ?? "" 18 let password = passwordTextField.text ?? "" 19 let name = nameTextField.text ?? "" 20 21 Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in 22 guard let self = self else { return } 23 if let user = result?.user { 24 let req = user.createProfileChangeRequest() 25 req.displayName = name 26 req.commitChanges() { [weak self] error in 27 guard let self = self else { return } 28 if error == nil { 29 user.sendEmailVerification() { [weak self] error in 30 guard let self = self else { return } 31 if error == nil { 32 // 仮登録完了画面へ遷移する処理 33 // サインアップ完了のフラグを保持する 34 UserDefaults.standard.set(true, forKey: "appSignUpStatusKey") 35 UserDefaults.standard.synchronize() 36 } 37 self.showErrorIfNeeded(error) 38 } 39 } 40 self.showErrorIfNeeded(error) 41 } 42 } 43 self.showErrorIfNeeded(error) 44 } 45 if (email == "" || password == "" || name == "") { 46 let message = "全てのフォームに記入して下さい。" 47 let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) 48 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 49 present(alert, animated: true, completion: nil) 50 } 51 } 52 53 private func showErrorIfNeeded(_ errorOrNil: Error?) { 54 // エラーがなければ何もしません 55 guard let error = errorOrNil else { return } 56 57 let message = "エラーが起きました" // ここは後述しますが、とりあえず固定文字列 58 let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) 59 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 60 present(alert, animated: true, completion: nil) 61 } 62 63 64 65 66 override func viewDidLoad() { 67 super.viewDidLoad() 68 69 // Do any additional setup after loading the view. 70 } 71 72} 73

swift4

1//ホーム画面.swift 2import UIKit 3 4class FirstViewController: UIViewController { 5 6 @IBOutlet weak var label: UILabel! 7 @IBOutlet weak var userLabel: UILabel!//このLabelにユーザー名を表示させたい 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 label.frame = CGRect(x: 0, y: 30, width: self.view.frame.width, height: 150) 13 label.textAlignment = NSTextAlignment.center 14 15 label.numberOfLines = 2 16 self.view.addSubview(label) 17 18 let now = Date() 19 let formatter = DateFormatter() 20 21 formatter.dateFormat = "yyyy/MM/dd" 22 label.text = formatter.string(from: now) 23 // Do any additional setup after loading the view. 24 25 } 26} 27

#やってみたこと
どうすればいいのかわからないので、是非ご教授願います。
#エラー
エラーは特にありません。

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

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

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

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

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

fathy

2019/07/21 13:10

viewcontrollerの関係を追記してください。 presentしているのか,navigationController でpushしているのかで処理は異なります。
guest

回答1

0

ベストアンサー

FirstViewControllerStringの変数を持たせて、
画面遷移の際に渡してしまうのが一番早いと思います。

Swift

1// FirstViewController 2class FirstViewController: UIViewController { 3 4 @IBOutlet weak var label: UILabel! 5 @IBOutlet weak var userLabel: UILabel!//このLabelにユーザー名を表示させたい 6 7 // ユーザー名 8 var userName: String = "" 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 label.frame = CGRect(x: 0, y: 30, width: self.view.frame.width, height: 150) 14 label.textAlignment = NSTextAlignment.center 15 16 label.numberOfLines = 2 17 self.view.addSubview(label) 18 19 let now = Date() 20 let formatter = DateFormatter() 21 22 formatter.dateFormat = "yyyy/MM/dd" 23 label.text = formatter.string(from: now) 24 // Do any additional setup after loading the view. 25 26 // ユーザー名を表示 27 userLabel.text = userName 28 } 29} 30

Swift

1// AccountViewController 2// Authの処理部分のみ抜粋します 3 4Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in 5 guard let self = self else { return } 6 if let user = result?.user { 7 let req = user.createProfileChangeRequest() 8 req.displayName = name 9 req.commitChanges() { [weak self] error in 10 guard let self = self else { return } 11 if error == nil { 12 user.sendEmailVerification() { [weak self] error in 13 guard let self = self else { return } 14 if error == nil { 15 // サインアップ完了のフラグを保持する 16 UserDefaults.standard.set(true, forKey: "appSignUpStatusKey") 17 UserDefaults.standard.synchronize() 18 19 // 仮登録完了画面へ遷移する処理 20 if let vc = UIStoryboard(name: "FirstViewController", bundle: nil).instantiateInitialViewController() as? FirstViewController { 21 // FirstViewControllerにuserNameを渡す 22 vc.userName = name 23 navigationController?.pushViewController(vc, animated: true) 24 } 25 } 26 self.showErrorIfNeeded(error) 27 } 28 } 29 self.showErrorIfNeeded(error) 30 } 31 }

ただ、これだと初回以降AccountViewControllerを通らない場合
userNameが空の文字列のままなので、サインアップのフラグと同じようにUserDefaultsで保存してしまった方がいいと思います。

サインアップのフラグ保存の処理の下に同じように保存の処理を書いて、
FirstViewControllerで読み込むだけです。

Swift

1// サインアップ完了のフラグを保持する 2UserDefaults.standard.set(true, forKey: "appSignUpStatusKey") 3// ユーザー名を保存する 4UserDefaults.standard.set(name, forKey: "userNameKey") 5UserDefaults.standard.synchronize()

Swift

1// FirstViewController 2class FirstViewController: UIViewController { 3 4 @IBOutlet weak var label: UILabel! 5 @IBOutlet weak var userLabel: UILabel!//このLabelにユーザー名を表示させたい 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 // 省略します 11 12 // ユーザー名を表示 13 if let userName = UserDefaults.standard.string(forKey: "userNameKey") { 14 userLabel.text = userName 15 } else { 16 userLabel.text = "読み込めなかった時" 17 } 18 } 19}

UserDefaultsplist形式でかなりシンプルなもので、
見ようと思えば中身を見ることもできるので、より本格的なアプリを作りたい場合はRealmを使って保存した方がいいと思います。

投稿2019/07/22 00:22

hayabusabusash

総合スコア767

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

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

Kaguya_4869

2019/07/25 12:10

回答ありがとうございます。 FirstViewControllerにuserNameを渡す所で、 vc.userName = name とありますが、そこで Value of type 'FirstViewController' has no member 'userName'; というエラーが出てしまいます。スペルや大文字、小文字も確認しましたが、このエラーが解消されません。 どうしてでしょうか?
hayabusabusash

2019/07/25 12:19

ご確認ありがとうございます! FirstViewControllerにuserNameというStringの変数は定義しましたか?
Kaguya_4869

2019/07/25 12:32

var userName: String = "" をviewdidloadの中に書いてしまっていたのが問題でした! エラー解消しました! いつもいつも本当にありがとうございます!!
hayabusabusash

2019/07/25 12:34

よかったです! ログインしているユーザーの情報などは端末に持った方がいいと思いますので、 よければUserDefaultsの方も試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問