実現したいこと
Swift製のEurekaを使ってFirebaseのuserNameを表示したい
・Eureka
https://github.com/xmartlabs/Eureka
発生している問題・分からないこと
動きがカクついてしまいます。
また正しい実装方法なのかもわからない状態です。
該当のソースコード
Swift
1import UIKit 2import Eureka 3import MessageUI 4 5class UserPageEditViewController: FormViewController, MFMailComposeViewControllerDelegate { 6 7 var userName: String = "" 8 9 // インスタンス 10 let viewModel = UserPageEditViewModel() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // ラベルに表示するためにここでデータを取得する 16 viewModel.fetchUserName() 17 // 監視 18 NotificationCenter.default.addObserver( 19 self, 20 selector: #selector(userNameFetched), 21 name: UserPageEditViewModel.userNameFetchedNotification, 22 object: nil 23 ) 24 25 // ----------- ナビゲーションバー ----------- // 26 // タイトル 27 self.navigationItem.title = "マイページ" 28 29 // ----------- Eureka ----------- // 30 form 31 // --------- プロフィール画像 --------- // 32 +++ Section("プロフィール画像") 33 <<< TextRow(){ row in 34 row.title = "プロフィール画像" 35 row.placeholder = "Enter text here" 36 } 37 // --------- 名前 --------- // 38 +++ Section("名前") 39 <<< TextRow(){ row in 40 row.title = "名前" 41 row.placeholder = self.viewModel.userName 42 } 43 44 // --------- 基本情報 --------- // 45 +++ Section("基本情報") 46 <<< LabelRow(){ row in 47 row.title = "アプリver" 48 row.value = "1.0" 49 } 50 51 // --------- 使い方 --------- // 52 <<< LabelRow(){ row in 53 row.title = "使い方" 54 row.value = "見る" 55 } 56 57 // --------- 問い合わせする --------- // 58 <<< LabelRow(){ row in 59 row.title = "問い合わせ" 60 row.value = "する" 61 }.onCellSelection { [unowned self] cell, row in 62 // メールを起動し、問い合わせする 63 self.sendEmail() 64 } 65 66 // --------- ログアウトする --------- // 67 <<< LabelRow(){ row in 68 row.title = "ログイン" 69 row.value = "ログアウトする" 70 }.onCellSelection { [unowned self] cell, row in 71 // ログアウトする 72 viewModel.firebaseLogOut() 73 } 74 } 75 76 77 // ------------ 問い合わせメール関連 ------------ // 78 func sendEmail() { 79 guard MFMailComposeViewController.canSendMail() else { 80 print("メールアカウントが設定されていません。") 81 return 82 } 83 84 let mailComposer = MFMailComposeViewController() 85 mailComposer.mailComposeDelegate = self 86 mailComposer.setToRecipients([""]) // 宛先のメールアドレス 87 mailComposer.setSubject("問い合わせ") 88 mailComposer.setMessageBody(getEmailBody(), isHTML: false) 89 90 present(mailComposer, animated: true, completion: nil) 91 } 92 93 func getEmailBody() -> String { 94 let deviceUUID = UIDevice.current.identifierForVendor?.uuidString ?? "Unknown UUID" 95 let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "Unknown Version" 96 97 let body = """ 98 ご連絡いただきありがとうございます。 99 100 以下、お問い合わせ内容です。 101 102 --- 103 104 デバイスのUUID: \(deviceUUID) 105 アプリのバージョン: \(appVersion) 106 107 お問い合わせ内容: ご入力いただいたお問い合わせ内容がここに入ります。 108 109 --- 110 111 よろしくお願いいたします。 112 """ 113 114 return body 115 } 116 117 // MARK: - MFMailComposeViewControllerDelegate 118 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 119 if let error = error { 120 print("エラー: \(error.localizedDescription)") 121 } 122 controller.dismiss(animated: true, completion: nil) 123 124 // キャンセルボタンが押された場合、ContactViewControllerを閉じる 125 if result == .cancelled { 126 self.dismiss(animated: true, completion: nil) 127 } 128 } 129 130 // 通知受信時の処理 131 @objc func userNameFetched() { 132 // ----------- Eureka ----------- // 133 form 134 // --------- プロフィール画像 --------- // 135 +++ Section("プロフィール画像") 136 <<< TextRow(){ row in 137 row.title = "プロフィール画像" 138 row.placeholder = "Enter text here" 139 } 140 // --------- 名前 --------- // 141 +++ Section("名前") 142 <<< TextRow(){ row in 143 row.title = "名前" 144 row.placeholder = self.viewModel.userName 145 } 146 147 // --------- 基本情報 --------- // 148 +++ Section("基本情報") 149 <<< LabelRow(){ row in 150 row.title = "アプリver" 151 row.value = "1.0" 152 } 153 154 // --------- 使い方 --------- // 155 <<< LabelRow(){ row in 156 row.title = "使い方" 157 row.value = "見る" 158 } 159 160 // --------- 問い合わせする --------- // 161 <<< LabelRow(){ row in 162 row.title = "問い合わせ" 163 row.value = "する" 164 }.onCellSelection { [unowned self] cell, row in 165 // メールを起動し、問い合わせする 166 self.sendEmail() 167 } 168 169 // --------- ログアウトする --------- // 170 <<< LabelRow(){ row in 171 row.title = "ログイン" 172 row.value = "ログアウトする" 173 }.onCellSelection { [unowned self] cell, row in 174 // ログアウトする 175 viewModel.firebaseLogOut() 176 } 177 } 178} 179 180
Swift
1import PKHUD 2import Firebase 3import Foundation 4 5 6class UserPageEditViewModel { 7 8 // 変数 9 var userInfos: [UserInfo] = [] 10 // ユーザーネーム 11 var userName: String = "" 12 // 通知用のキー 13 static let userNameFetchedNotification = Notification.Name("userNameFetched") 14 15 // ------ Firebaseからユーザーデータを取得する ------ // 16 func fetchUserData() { 17 // Firestoreのデータベース参照を作成 18 let db = Firestore.firestore() 19 20 // 最近ログインしているユーザーのUIDを取得 21 guard let uid = Auth.auth().currentUser?.uid else { 22 // ユーザーがログインしていない場合の処理 23 return 24 } 25 26 // Firestoreのコレクション参照を作成 27 let collectionRef = db.collection("user") 28 29 collectionRef.document(uid).getDocument { (document, error) in 30 if let document = document, document.exists { 31 // ドキュメントが存在する場合、データを取得して表示する 32 let data = document.data() 33 34 let userInfo = UserInfo( 35 uuid: data?["uuid"] as? String ?? "", 36 userName: data?["userName"] as? String ?? "", 37 firebaseId: data?["firebaseId"] as? String ?? "", 38 paymentStatus: data?["paymentStatus"] != nil, 39 createTimeStamp: data?["createTimeStamp"] as? String ?? "", 40 updateTimeStamp: data?["updateTimeStamp"] as? String ?? "" 41 ) 42 // 追加 43 self.userInfos.append(userInfo) 44 45 } else { 46 // ドキュメントが存在しない場合の処理 47 print("Document does not exist") 48 } 49 } 50 } 51 52 // ------ ユーザーネームを取得する ------ // 53 func fetchUserName() { 54 // Firestoreのデータベース参照を作成 55 let db = Firestore.firestore() 56 // 最近ログインしているユーザーのUIDを取得 57 guard let uid = Auth.auth().currentUser?.uid else { 58 // ユーザーがログインしていない場合の処理 59 return 60 } 61 // Firestoreのコレクション参照を作成 62 let collectionRef = db.collection("user") 63 // コレクションを取得する 64 collectionRef.document(uid).getDocument { (document, error) in 65 if let document = document, document.exists { 66 let data = document.data() 67 68 guard let userName = data!["userName"] as? String else { 69 print("①UserName does not exist") 70 return 71 } 72 73 // 変数の保存 74 self.userName = userName 75 // 通知を送信 76 NotificationCenter.default.post(name: UserPageEditViewModel.userNameFetchedNotification, object: nil) 77 78 } else { 79 print("②UserName does not exist") 80 } 81 } 82 } 83 84 // ------ Firebaseからログアウトする ------ // 85 func firebaseLogOut() { 86 do { 87 try Auth.auth().signOut() 88 HUD.flash(.label("ログアウトしました。"), delay: 2.0) 89 } catch let signOutError as NSError { 90 print("ログアウトエラー: \(signOutError.localizedDescription)") 91 HUD.flash(.label("失敗。"), delay: 2.0) 92 } 93 } 94} 95
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
・表示することは出来ました。
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。