ユーザー認証画面でゲスト閲覧か認証(新規登録orログイン)をするかで、userdefaultに"login"もしくは"guest"の文字列をcheckとして保存し、それを読み込むことでプロフィール画面にcheckの値が"login"ならばuserdefaultにすでに保存しておいたプロフィール情報をimageviewやtextfieldにセットする。(+それらへの入力操作を許可する)
またはcheckの値が"guest"ならば入力操作を許可せず、名前に”ゲスト閲覧”と表示、imageviewには初期画像を表示する機能を作っております。
⑴ 現在、前述した処理をviewWillApearに書いております。しかしここに書くとアイコン画像を変更するために画像をタップし、画像を選択し終わるとまたviewWillApearの中の処理が呼ばれてせっかく変えたアイコン画像が、元からuserdefaultに保存されていた画像に変わってしまいます。
⑵ この挙動を直すためにviewWillApearの中の処理をviewDidLoadに丸々移し替えたところ、上記の問題点は解決されたものの、ビューがロードされた一度しか呼ばれないためか、下記の画面外の認証画面で他アカウントに変えてログインしたり、新規登録し直した後にまたプロフィール画面に戻ってくると前回のアカウント情報が表示されたままになってしまいます。
⑴、⑵の問題点を同時に両方解決する方法はないでしょうか?
以下が現在のコードです
swift
1 2import UIKit 3import Firebase 4import KRProgressHUD 5 6class EditProfile: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 7 8 @IBOutlet var iconImageView: UIImageView! 9 @IBOutlet var nameTextField: UITextField! 10 @IBOutlet var tapImage: UITapGestureRecognizer! 11 @IBOutlet var changeProfButton: UIButton! 12 13 var ref: DatabaseReference! 14 let userDefault = UserDefaults.standard 15 16 17 override func viewWillAppear(_ animated: Bool) { 18 super.viewWillAppear(true) 19 20 let check = userDefault.object(forKey: "check") as! String 21 22 //ゲスト閲覧ならばプロフ変更を許可しない 23 if check == "guest" { 24 nameTextField.text = "ゲスト閲覧" 25 nameTextField.isEnabled = false 26 iconImageView.image = UIImage(named: "user.png") 27 tapImage.isEnabled = false 28 changeProfButton.isHidden = true 29 30 //正規ユーザーの場合の名前と画像をセット 31 } else if check == "login" { 32 nameTextField.isEnabled = true 33 tapImage.isEnabled = true 34 changeProfButton.isHidden = false 35 36 let username = userDefault.object(forKey: "username") 37 nameTextField.text = username as? String 38 39 if let encodedData = userDefault.object(forKey: "usericon") { 40 let decodedData = Data(base64Encoded: encodedData as! String, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) 41 let decodedImage = UIImage(data: decodedData! as Data) 42 iconImageView.image = decodedImage 43 } 44 45 } 46 47 48 } 49 50 override func viewDidLoad() { 51 super.viewDidLoad() 52 53 nameTextField.delegate = self 54 55 } 56 57 @IBAction func changeIcon(_ sender: UITapGestureRecognizer) { 58 //画像をセット 59 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 60 61 let pickerView = UIImagePickerController() 62 pickerView.sourceType = .photoLibrary 63 pickerView.delegate = self 64 self.present(pickerView, animated: true) 65 66 } 67 } 68 69 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 70 71 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 72 iconImageView.image = image 73 dismiss(animated: true) 74 75 76 } 77 78 //userdefaultとサーバに送る 79 @IBAction func changeProfile(_ sender: Any) { 80 81 82 83 //userdefaultに保存 84 85 //名前 86 let username = nameTextField.text 87 userDefault.set(username, forKey: "username") 88 89 //アイコン画像 90 var data: Data = Data() 91 if let image = iconImageView.image { 92 data = UIImageJPEGRepresentation(image, 0.1)! as Data 93 } 94 let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String 95 userDefault.set(encodedIcon, forKey: "usericon") 96 97 98 //サーバに保存 99 let uid = Auth.auth().currentUser?.uid 100 101 //名前はRDBに保存 102 let RDBref = Database.database().reference() 103 let prof: Dictionary = ["username": username] 104 RDBref.child("profs").child(uid!).setValue(prof) 105 106 //アイコンは(初期画像でなければ)Storageに保存 107 if iconImageView.image != UIImage(named: "user.png") { 108 let storageRef = Storage.storage().reference() 109 storageRef.child("usericons").child(uid!).putData(data, metadata: nil) 110 } 111 KRProgressHUD.showSuccess(withMessage: "変更しました") 112 113 } 114 115 //空文字はボタンを隠す 116 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 117 118 if textField.text == "" { 119 changeProfButton.isHidden = true 120 } else { 121 changeProfButton.isHidden = false 122 } 123 return true 124 } 125 126 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 127 textField.resignFirstResponder() 128 return true 129 } 130 131 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 132 nameTextField.resignFirstResponder() 133 } 134 135 override func didReceiveMemoryWarning() { 136 super.didReceiveMemoryWarning() 137 // Dispose of any resources that can be recreated. 138 } 139 140 141 /* 142 // MARK: - Navigation 143 144 // In a storyboard-based application, you will often want to do a little preparation before navigation 145 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 146 // Get the new view controller using segue.destinationViewController. 147 // Pass the selected object to the new view controller. 148 } 149 */ 150 151} 152
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/31 05:39
2018/03/31 05:52
2018/03/31 09:08